Theseis 3D engine design ideas George -outsider- Markou Κύριε Τσιομπίκα, ας αρχίσω με το coding style. a) Variable naming Προτείνεις vertex_count. Χρησιμοποιώ vertexCount (το πρώτο μικρό, και μετά τα αρχικά με κεφαλαίο). Δεν διαφωνώ. Ο δικός μου τρόπος θυμίζει java (jesus!). Ο δικός σου c/c++. Και οι δύο τρόποι είναι ευανάγνωστοι (κατ'εμέ). Ας πάμε με vertex_count. no fuckin problem. b) Function naming. void MyFunc (); Όχι, το my_func δεν είναι πιο όμορφο, και το μπερδέυεις και με τις μεταβλητές. Χέστηκα πιο είναι το standard της c/c++. Ψηφίζω MyFunc. c) Tabs. Κατ'αρχάς συμφωνώ οτι 1 tab = 4 spaces. το 1t=8s είναι λίγο ελεεινό. Αλλα γιατί όχι spaces; πού είναι το πρόβλημα; Εγώ αλλού πατάω tab, αλλού spaces. Έχοντας επιλογή στον editor "Convert tabs into spaces" δεν υπάρχει κανένα πρόβλημα. ΜΗΝ ΕΙΣΑΙ ΨΕΙΡΑΣ! :) d) brace style. Οταν ήμουνα παιδί, στα αθώα αυτά χρόνια, και έγραφα Pascal (oh, yes) χρησιμοποιούσα το : if (kati = katiallo) then begin {bla bla} end; δηλαδή : if (kati == katiallo) { // bla bla } όταν άρχισα να γράφω C, το "{" με προβλημάτιζε λίγο (δεν το είχα συνηθίσει) και άρχισα να του αφιερώνω μια ολόκληρη γραμμή για να το ξεχωρίζω. (καλά, τότε έκανα και κάτι κουλά του στύλ : #define then #define begin { #define end } Το παραπάνω ας μείνει μεταξύ μας, πες οτι δεν έγινε ποτέ... :) ) anyway, εκεί που θέλω να καταλήξω είναι οτι συμφωνώ με το for (int i = 0 ; i < num; i ++) { // bla bla } ΑΛΛΑ ΟΧΙ ΣΤΙΣ FUNCTIONS. ΑΑΑΑΑΑ, όλα κι όλα. Έκεί προτιμώ να αφιερώνω στο { μια ολόκληρη γραμμή. Και αφού είναι the only true brace style, ας το χρησιμοποιήσουμε... :) d) class/struct etc naming Ναι, συμφωνούμε με το MyTestClass και εννοείται ΟΧΙ TMyTestClass. e) spacing η γνώμη μου για τα παρακάτω είναι η εξής: if (x == 0) --> οκ if ( x == 0 ) --> too much spacing if ( x==0 ) --> προτιμώ το x == 0 (με κενά), αλλά οκ. MyFunc ( x, y, z ); --> too much spacing MyFunc (x, y, z); --> ok MyFunc( x, y, z ); --> προτιμώ τον παραπάνω τρόπο, αλλα οκ. MyFunc(x,y,z); ---> ΠΙΣΩ ΜΟΥ ΣΕ ΕΧΩ ΣΑΤΑΝΑ! ας αφήσουμε και κανα κενό, έτσι; Η γνώμη μου είναι οτι αν αποφύγουμε το too much spacing και το no spacing at all, μπορεί ο καθένας να χρησιμοποιεί ότι τον βολευει. Δεν νομίζω ναι είναι και τόσο πρόβλημα. f) const correctness : οκ. -------------------------------------------------------------------------------------------------------------------------------------------- Graphics Core. Θα πω κάτι και ας φάω ξύλο. Προτείνω να παίξουμε και με OpenGl και με Direct3D. (Αχ, ωχ, άουτς, ρε μου μάτωσες την μύτη!) Και ας κάνω μια πιο in depth ανάλυση : Initialization : bool InitGraphics (InitParams *p); void DestroyGraphics (); νομίζω οτι με αυτόν τον τρόπο, μπορούμε να δουλέψουμε απο OpenGL και Direct3D μέχρι τοστιέρες, φούρνους μικροκυμάτων και τα ΠΑΝΤΑ. Να προχωρήσω λίγο την σκέψη μου: Σκέψου οτι το engine είναι ένα dll ή whatever στο linux. έστω gl_eng.dll και dx_eng.dll σκέψου μία function : bool InitializeEngine (char *file_name); και void ReleaseEngine (); οπου file_name το όνομα του dll. tada! Επίσης : char *GetRendererName (); π.χ. επιστρέφει "OpenGL Renderer" ή "Direct3D 9.x Renderer" και whatever *GetRendererVersion (); και int GetAvailableRenderersCount (); RendererInfo *GetRendererInfo (int index); οπου οι renderers (τα dll's) βρίσκονται σε ένα directory π.χ. /core/renderers/ ( το οποίο παρεπιπτόντως μπορεί να ορίζεται με μια function του styl void SetRenderersPath (char *path); ) και οι ρουτίνες αυτές ψάχνουν όλα τα dlls που βρίσκονται σε αυτό το path και είναι renderers. Με αυτόν τον τρόπο, μπορούμε να κάνουμε implement έναν renderer σε π.χ. CloseGL ή whatever, να βάλουμε το dll αυτού του renderer στο path, και απλά να παίξει. Πώς σου φαίνεται το init ως τώρα; MOVING ON... state managment. ναι, συμφωνούμε. Πρέπει να είναι C - interface, και minimal. οτιδήποτε πιο "fancy" θα πάει σε κάποιο layer πιο επάνω. states : SetAlphaTest (bool enable); SetAlphaFunc (AlphaFunc func, float alpha_ref); SetBlend (bool enable); SetBlendFunc (SrcBlendFunc src, DestBlendFunc dst); SetCulling (bool enable); SetCullFace (CullFace face); SetDepthTest (bool enable); SetDepthFunc (DepthFunc func); // το depth range ας παραμείνει απο 0.0 εώς 1.0 χωρίς να μπορούμε να το αλλάξουμε SetNormalizeNormal (bool enable); SetCurrentMaterial (Material *mat); SetLighting (bool enable); SetLightEnable (int light_id, bool enable);