Class TNodeGeneralShape

DescriptionHierarchyFieldsMethodsProperties

Unit

Declaration

type TNodeGeneralShape = class(TVRMLNode)

Description

Shape is the only node that produces some visible results during rendering. Basically, most if the VRML language is just a method of describing those shapes and many other nodes are defined only to set up additional state for shapes (materials, transformations, lighting).

Some exceptions to this are camera nodes, sensors (WWWAnchor in VRML 1.0), Info, WorldInfo, Background, Fog. These nodes specify some things that can't be embedded in simple Render command for a node. These things describe

This class may have some special functionality and it builds comfortable object inheritance hierarchy. For example, now we can use EnumerateNodes(TNodeGeneralShape).

A few things that make Shape node special :

Hierarchy

Overview

Methods

Public function BoundingBox(State: TVRMLGraphTraverseState): TBox3d; virtual;
Public function LocalBoundingBox(State: TVRMLGraphTraverseState): TBox3d; virtual;
Public function VerticesCount(State: TVRMLGraphTraverseState; OverTriangulate: boolean): Cardinal; virtual; abstract;
Public function TrianglesCount(State: TVRMLGraphTraverseState; OverTriangulate: boolean): Cardinal; virtual; abstract;
Public procedure Triangulate(State: TVRMLGraphTraverseState; OverTriangulate: boolean; NewTriangleProc: TNewTriangleProc);
Public procedure LocalTriangulate(State: TVRMLGraphTraverseState; OverTriangulate: boolean; NewTriangleProc: TNewTriangleProc); virtual; abstract;

Description

Methods

Public function BoundingBox(State: TVRMLGraphTraverseState): TBox3d; virtual;

BoundingBox oblicza BoundingBox shape node'a VRMLa ktory podczas trawersowania grafu VRML'a ma stan State.

LocalBoundingBox liczy BoundingBox jakby Transform = IdentityMatrix, czyli liczy bounding box wzgledem lokalnego ukladu node'a.

W tej klasie LocalBoundingBox jest liczone jako BoundingBox ktore dostaje specjalnie spreparowane State z Transform = zawsze Identity. Jest to poprawna metoda realizacji LocalBoundingBox'a natomiast nieco nieoptymalna czasowo : bedzie wykonywanych wiele mnozen przez macierz o ktorej wiadomo ze jest Identity. Wiec w podklasach mozesz pokrywac ta metode aby liczyc LocalBoundingBox'a w szybszy sposob.

Zwracam uwage ze odwrotny pomysl — realizacja BoundingBox'a przez LocalBoundingBox'a (transformujac wyliczony LocalBoundingBox przez State.Transform) nie jest juz tak dobrym pomyslem — mozemy w rezultacie otrzymac o wiele za duze BoundingBox'y.

Tym niemniej miejscami zamierzam tak liczyc BoundingBox'a — np. dla sfery. Wiec w tej klasie BoundingBox jest zaimplementowany wlasnie jako LocalBoundingBox transformowany o State.Transform.

W kazdej podklasie Shape powinienes pokryc przynajmniej jedna z tych metod — jak to napisalem powyzej, jezeli nie pokryjesz BoundingBox'a to byc moze otrzymany BoundingBox bedzie nieco za duze (co jest w sumie dopuszczalne, ale nie do przesady), jezeli nie pokryjesz LocalBoundingBox — to LocalBoundingBox nie bedzie liczony tak szybko jak moglby byc. Najlepiej wiec byloby gdybys pokrywal obie te metody.

Public function LocalBoundingBox(State: TVRMLGraphTraverseState): TBox3d; virtual;
 
Public function VerticesCount(State: TVRMLGraphTraverseState; OverTriangulate: boolean): Cardinal; virtual; abstract;

kazda podklasa GeneralShape musi pokrywac i implementowac te metody.

Te metody zwracaja ilosc trojkatow jaka definiuje [Local]Triangulate (z takimi samymi parametrami State i OverTriangulate) dla tego node'a i ilosc roznych vertexow jakie sa uzywane w tych trojkatach (chociaz nie wykonuje w tym celu zadnych porownan miedzy zdefiniowanymi punktami w node'ach i definiujac nieporzadnie node'y (np. podajac dwa razy ten sam punkt w Coordinate3) mozesz latwo to oszukac). (acha, dla PointSet naturalnie nie ma zadnych trojkatow ale VerticesCount to ciagle liczba vertexow, mimo ze nie sa uzywane w zadnych trojkatach).

State chwilowo nie jest nigdzie uzywany w TrianglesCount, ale jestem gotowy gdyby w przyszlosci jakis node tego potrzebowal (bo w sumie nie byloby w tym nic wyjatkowego, tzn. nie byloby to nic co w modelu VRMLu jaki tu zaimplementowalem musialbym gdziekolwiek traktowac jako jakis wyjatek)

Uwaga — gdy przychodzi do TrianglesCount moze sie okazac ze Triangulate zwrocilo inna ilosc trojkatow gdy niektore face byly non-convex (bo w tym przypadku TriangulateFace ma prawo pousuwac trojkaty zdegenerowane do punktu). Generalnie nie polegaj na TrianglesCount jako na dokladnej wartosci — raczej jako na przyblizeniu ktore zazwyczaj bedzie bardzo bardzo dokladne.

Public function TrianglesCount(State: TVRMLGraphTraverseState; OverTriangulate: boolean): Cardinal; virtual; abstract;
 
Public procedure Triangulate(State: TVRMLGraphTraverseState; OverTriangulate: boolean; NewTriangleProc: TNewTriangleProc);

triangulate node = call NewTriangleProc for each triangle this node defines. NewTriangleProc will be called with (Tri, State, Node) where Tri will be new triangle, and State will always be State podany tutaj parametrem and Node will always be Self.

LocalTriangulate robi to samo ale nie uwzglednia State.Transform. W podklasach trzeba zdefiniowac tylko LocalTriangulate.

Jezeli OverTriangulate = false to [Local]Triangulate generuje tylko tyle trojkatow zeby doskonale odzwierciedlac ksztalt node'a. W przypadku gdy nie jest to mozliwe (np. przy kulach, stozkach itp.) [Local]Triangulate uzywa State.KambiTriangulation aby zdecydowac sie jak dobre chcemy miec przyblizenie oryginalu.

Jezeli OverTriangulate = true to [Local]Triangulate moze wygenerowac wiecej trojkatow — w przypadku duzych powierzchni moze zdecydowac sie zeby je rozbic na wiecej malych trojkatow niz jest to rzeczywiscie potrzebne aby wyrazic te powierzchnie jako zbior trojkatow. Np. node Cube (szescianik) mozna wyrazic doskonale dokladnie jako 12 trojkatow i to wlasnie zrobimy gdy OverTriangulate = false. ALE gdy OverTriangulate = true my rozbijemy kazda sciane szescianu na WIECEJ trojkatow, zgodnie z parametrem State. KambiTriangulation .RectDivisions. Do czego to sie moze przydac ? Gdy uzywasz cieniowania Gourauda (albo jeszcze gorzej, cieniowania plaskiego) jedynym remedium zeby renderowac rozblyski na srodku duzych powierzchni jest wlasnie rozbijac te powierzchnie na duzo trojkatow.

Public procedure LocalTriangulate(State: TVRMLGraphTraverseState; OverTriangulate: boolean; NewTriangleProc: TNewTriangleProc); virtual; abstract;
 

Generated by PasDoc 0.10.0 on 2008-02-25 00:00:42