Ik ben maar eens gedoken in engine design en dergelijke. En de scenegraph is toch wel een wezelijk belangrijk gedeelte van de rendering engine! Daarom ben ik begonnen met deze in elkaar te zetten.
De scenegraph is een Tree waarin elke node slechts 1 parent kan hebben. BEHALVE een geometrie node, die kan meerdere parents hebben ivm instancing.
Er zijn op dit moment een aantal simpele TreeNodes (die allemaal iSceneGraphNode implementen):
Root - root node, doet niks interessants (internal class)
Transformation - past de world matrix aan.
Material - class met daarin de effect file en paramaters
Renderstate - culling, wireframe, zbuffer enzovoort
Geometry - Node met mesh, NIET instancable
InstancableGeometry - Instance Mesh!
Bij het traversen wordt state uit deze nodes automatisch overgegeven. Plaats je bijvoorbeeld een material recht onder de root, dan worden alle meshes volgens die material gerendert.
Objecten worden aan andere nodes gehangen (node.Append(new_node)), en inheriten de complete traversal state van de parent!
Dit werkt allemaal prachtig! Het is nu al mogelijk om bijvoorbeeld 2 objecten te renderen en dmv een renderstate node de ene in wire en de andere als solid te renderen.
Nou komt het: de material class is een placeholder, slechts een class met daarin een Effect.
Het idee is als volgt: Een heleboel kleine functies in aparte txt files (bv doWorldTransform, doTexFetch, etc), die je in een programma alá een tree (input naar output weer naar input etc) kunt koppelen. Dit programma knalt er vervolgens een fx file uit die je in de engine kunt gebruiken, ook genereert hij in een xml file de 'material container'. een stukkie xml waarin de parameters, type en effect path staan.
Een andere (static) class kent dan materials toe aan nodes: een node geeft aan welke functies hij wil hebben (bv Phong etc) in de effect file en de class zoekt op of dit mogelijk is en returnt de effect.
Maar het probleem is: als je dit bekijkt, dan lijkt het makkelijker om het anders te doen: maak een simpele material creater. Je knalt in die creator wat je wilt hebben: bv phong, 2 textures etc, en deze generate on the fly een fx (of haalt hem uit cache van schijf op).
Toch lijkt het me dat dit systeem minder robuust is dan het eerste. Het 2e systeem is beperkt daar je in de source moet gaan aanpassen als je echt nieuwe functietjes bijschrijft (de material creater weet namelijk niet wat hij ermee moet). Maar, het is denk ik veel makkelijker implementeren...
Ik ben zeer in dubio en neig zelf eerlijk gezegd naar optie 1, wat waarschijnlijk weken werk is. Daarom ben ik benieuwd wat anderen ervan vinden, voordat ik iets zeer stoms doe en weken verspil!
De scenegraph is een Tree waarin elke node slechts 1 parent kan hebben. BEHALVE een geometrie node, die kan meerdere parents hebben ivm instancing.
Er zijn op dit moment een aantal simpele TreeNodes (die allemaal iSceneGraphNode implementen):
Root - root node, doet niks interessants (internal class)
Transformation - past de world matrix aan.
Material - class met daarin de effect file en paramaters
Renderstate - culling, wireframe, zbuffer enzovoort
Geometry - Node met mesh, NIET instancable
InstancableGeometry - Instance Mesh!
Bij het traversen wordt state uit deze nodes automatisch overgegeven. Plaats je bijvoorbeeld een material recht onder de root, dan worden alle meshes volgens die material gerendert.
Objecten worden aan andere nodes gehangen (node.Append(new_node)), en inheriten de complete traversal state van de parent!
Dit werkt allemaal prachtig! Het is nu al mogelijk om bijvoorbeeld 2 objecten te renderen en dmv een renderstate node de ene in wire en de andere als solid te renderen.
Nou komt het: de material class is een placeholder, slechts een class met daarin een Effect.
Het idee is als volgt: Een heleboel kleine functies in aparte txt files (bv doWorldTransform, doTexFetch, etc), die je in een programma alá een tree (input naar output weer naar input etc) kunt koppelen. Dit programma knalt er vervolgens een fx file uit die je in de engine kunt gebruiken, ook genereert hij in een xml file de 'material container'. een stukkie xml waarin de parameters, type en effect path staan.
Een andere (static) class kent dan materials toe aan nodes: een node geeft aan welke functies hij wil hebben (bv Phong etc) in de effect file en de class zoekt op of dit mogelijk is en returnt de effect.
Maar het probleem is: als je dit bekijkt, dan lijkt het makkelijker om het anders te doen: maak een simpele material creater. Je knalt in die creator wat je wilt hebben: bv phong, 2 textures etc, en deze generate on the fly een fx (of haalt hem uit cache van schijf op).
Toch lijkt het me dat dit systeem minder robuust is dan het eerste. Het 2e systeem is beperkt daar je in de source moet gaan aanpassen als je echt nieuwe functietjes bijschrijft (de material creater weet namelijk niet wat hij ermee moet). Maar, het is denk ik veel makkelijker implementeren...
Ik ben zeer in dubio en neig zelf eerlijk gezegd naar optie 1, wat waarschijnlijk weken werk is. Daarom ben ik benieuwd wat anderen ervan vinden, voordat ik iets zeer stoms doe en weken verspil!