[ Predrag Damnjanovic @ 11.03.2002. 18:41 ] @
Pisem OpenGL engine...
Evo kako mi je organizovano jezgro engine-a :
Podatke o objektima cuvam u jednom multi-dimenzionom nizu:
float item[100][100][100];
U prvoj dimenziji su redni brojevi objekata, druga dimenzija su poligoni, a u trecem sami podaci o objektu/poligonu: pozicija, tacke, boja...
E sad, u jezgru imam petlju, koja redom iscrtava objekte.
Evo uproscene skice jezgra:

for (n=1; n<broj_objekata; n++) {
if (item[n][0][0]=1) crtaj_kocku(n);
if (item[n][0][0]=2) crtaj_loptu(n);
if (item[n][0][0]=3) crtaj_piramidu(n);
...
}

E sad, vidite gde je problem, ako imam 1000 razlicitih figura, moram da imam 1000 if-ova, jer moram za svaku figuru da ispitam da li je ta.

Da li mora ovako?
Mozda nesto da pokusam sa CASE ?

Kad bih mogao pomocu promenljive 'n' direktno da pozivam funkcije, bilo bi super
Zamisli koliko bi ovo bilo mocno: crtaj_objekat[n];

Sta ti mislite uopsteno na celu koncepciju engine-a ?
[ Dragi Tata @ 11.03.2002. 19:22 ] @
1. Mislim da nije dobra ideja da imaš "tvrde" granice niza: float item[100][100][100]; Šta ako korisnik unese više od 1000 objekata? Radi to dinamički.

2. Da koristiš C++ ne bi imao taj problem, ali pošto insistiraš na C-u, jedino mogu da ti preporučim da napraviš niz pointera na funkcije. To je najsličnije onome što hoćeš da uradiš...
[ Predrag Damnjanovic @ 11.03.2002. 19:31 ] @
Pa kolk'i sam ja bolid, pa upravo OOP, koga pljujem, je resenje :)
LOL, shvatio sam upravo poentu OOP-a :)

Nego, kako se pravi dinamicki niz u C-u?
I kako da napravim niz pointera na funkcije?
[ Dragi Tata @ 11.03.2002. 19:43 ] @
Za dinamički niz u C-u pogledaj

http://www.eskimo.com/~scs/C-faq/q6.16.html (hvala Gojku za link), a pogledaj i funkciju realloc

Pointere na funkcije deklarišeš na ovaj način

http://www.eskimo.com/~scs/C-faq/q1.34.html

a kad to znaš, lako ćeš da napraviš niz (statički).

Što se tiče OO-a, uteha može da ti bude činjenica da bi u ovom slučaju takvo rešenje usporilo tvoj kod, a ne verujem da to želiš.

Žao mi je što ne mogu da budem detaljniji u odgovorima. Trenutno nemam baš vremena, ali nadam se da ću za par dana da se oslobodim gužve...
[ pegazus @ 11.03.2002. 19:57 ] @
typedef void (*fun)(void);

fun crtac[100]; // fun *crtaci = new fun[n];
...
crtac();

u C-u mozes sve (mozda na malo tezi nacin)
cak i OOP.

[ Milan Aksic @ 11.03.2002. 20:36 ] @
Mozda bi moglo ovako:
Code:

void crtajKocku(int n);
void crtajLoptu(int n);
void crtajPiramidu(int n);

const int naPrimer = 3;

void (*pFuncArray[naPrimer])(int);

pFuncArray[0] = crtajKocku;
pFuncArray[1] = crtajLoptu;
pFuncArray[2] = crtajPiramidu;

i onda umesto:
Code:

for (n=1; n<broj_objekata; n++)
{
if (item[n][0][0]=1) crtaj_kocku(n); 
if (item[n][0][0]=2) crtaj_loptu(n); 
if (item[n][0][0]=3) crtaj_piramidu(n); 


pises:
Code:

int temp;
for (n = 1; n < broj_objekata; n++)
{
temp = item[n][0][0];
pFuncArray[temp](n);
}

Ne bih ti preporucio da koristis switch sa mnogo case stavki jer mogu da znatno uspore program.

Dragi tata, da li mozes da me podsetis, kako bi to moglo da se uradi u C++ ? Da li bi npr. napravio baznu klasu npr. Objekat sa viruelnom funkcijom crtajObjekat, onda iz njega izveo specificne klase, kao npr. Kocka, Piramida itd. naravno u njima bi bila preklopljena crtajObjekat funkcija clanica. Onda se napravi pokazivac na baznu klasu, i kreira se, na slobodnom skladistu, specifican objekat (Kocka, Piramida), koristilo bi se naravno public nasledjivanje, i onda kada se ukaze potreba za funkcijom crtajObjekat, pozove se ispravna funkcija iz ispravne klase (Kocka, Piramida):
Code:

Objekat* pObj;
pObj = new Kocka;
pObj -> crtajObjekat();

Ili si drugacije mislio ?
[ Dragi Tata @ 11.03.2002. 21:03 ] @
Upravo tako sam mislio. Jedino što su ti pozivi virtualnih funkcija malo sporiji nego kad imaš compile-time bounding, a ne znam koliko je to prihvatljivo za 3D grafiku.

A i ono sa nizovima pointera si baš lepo ispisao - svaka čast.

Predlažem prvom Super Moderatoru koji bude čitao ovo da da neku finu ocenu passangeru :)
[ leka @ 11.03.2002. 21:38 ] @
Predraze, seti se samo moje price na IRC-u kada si pljuvao po OOP-u i kada sam ti rekao da je UPRAVO OOP dusu dao za 3D!
Heh, vreme cini svoje... ;)
[ Predrag Damnjanovic @ 11.03.2002. 22:36 ] @
Hvala svima.
Razmislicu jos jednom o OOP-u, mada ako ovo u C-u drzi vodu, onda...
[ Predrag Damnjanovic @ 11.03.2002. 23:05 ] @
Ono stvarno drzi vodu
Dole OOP
[ Predrag Damnjanovic @ 11.03.2002. 23:09 ] @
Citat:
Dragi Tata:
Što se tiče OO-a, uteha može da ti bude činjenica da bi u ovom slučaju takvo rešenje usporilo tvoj kod, a ne verujem da to želiš.

Na koje resenje mislis, na OOP resenje ili ovo u C-u sa pointerima na funkciju?
[ Ivan Tanasic @ 11.03.2002. 23:21 ] @
Citat:
zastita:
Ono stvarno drzi vodu
Dole OOP



Da, bure drzi vodu dok majstori ne odu
[ Dragi Tata @ 11.03.2002. 23:34 ] @
Citat:
zastita:
Na koje resenje mislis, na OOP resenje ili ovo u C-u sa pointerima na funkciju?


Mislim na OOP rešenje. Ono je sporije zbog poziva virtualnih funkcija.
[ Predrag Damnjanovic @ 11.03.2002. 23:45 ] @
Citat:
Dragi Tata:
Mislim na OOP rešenje. Ono je sporije zbog poziva virtualnih funkcija.

Tako sam i mislio :)
Ipak ostajem u non-OPP taboru :)
[ Milan Aksic @ 11.03.2002. 23:45 ] @
Citat:
Dragi Tata:
Upravo tako sam mislio. Jedino što su ti pozivi virtualnih funkcija malo sporiji nego kad imaš compile-time bounding, a ne znam koliko je to prihvatljivo za 3D grafiku.

A i ono sa nizovima pointera si baš lepo ispisao - svaka čast.

Predlažem prvom Super Moderatoru koji bude čitao ovo da da neku finu ocenu passangeru :)


Hvala dragi cale :) mada ono sa pointerima na funkcije moze da se implemetira da radi i sa funkcijama clanicama ali sada trentno nemam vremena da pisem, a koliko vidim i Peca nije zainteresovan toliko za C++ odnosno OOP.
[ leka @ 12.03.2002. 06:40 ] @
Koliko ja znam i tatko moze da ocenjuje ovde :)
[ leka @ 12.03.2002. 06:42 ] @
A zasto lepo ne koristite dinamicke liste?
[ Predrag Damnjanovic @ 12.03.2002. 10:23 ] @
Citat:
leka:
A zasto lepo ne koristite dinamicke liste?

Mislis umesto nizova?
Imas li konkretan primer za to?
[ Dragi Tata @ 12.03.2002. 16:01 ] @
Citat:
leka:
Koliko ja znam i tatko moze da ocenjuje ovde :)


Ne mogu, Leko, veruj mi. Ja sam moderator, a samo super-moderatori ocenjuju...
[ pegazus @ 12.03.2002. 16:42 ] @
Nisam siguran kako si zamislio svoj engine,
ali mija ideja je sledeca:
Svaki objekat ima:
1.oblik
2.tacke
3.dimenzije.

Realizacija sledi, sve mozes da modifikujes po
svojim potrebama.

#include <stdlib.h>
#include <stdio.h>
#define MAXOBJEKATA 1000
typedef struct TTacka {
int x;
int y;
}
Tacka;
typedef void (*fun)(Tacka*, int, int*,int);/* svaki graficki
objekat je opisan nizom tacaka i nizom dimenzija
*/
void crtaj_loptu(Tacka *tacke, int brojTacaka, int* dimenzije, int
brojDimenazija)
{ printf("Lopta\npos:%d %d\nprecnik:%d\n", tacke->x, tacke->y, *dimenzije); }
void crtaj_kocku(Tacka *tacke, int brojTacaka, int* dimenzije, int
brojDimenazija)
{ /* */ }
void crtaj_piramidu(Tacka *tacke, int brojTacaka, int* dimenzije, int
brojDimenazija)
{ /* */ }


typedef struct GGrafickiObjekat {
Tacka* pos;
int bpos;
int* dim;
int bdim;
fun draw;
}
GrafickiObjekat;
GrafickiObjekat*
engine = new GrafickiObjekat[MAXOBJEKATA];// probaj sa malloc
int brojGO;//broj grafickih objekatka
void add(GrafickiObjekat g) {
if (brojGO<MAXOBJEKATA) {
engine[brojGO++] = g;
}
}
void draw() {
int j;
for(j=0;j!=brojGO;j++) {
engine[j].draw(engine[j].pos,engine[j].bpos,
engine[j].dim,engine[j].bdim);
}
}
int main()
{
/*...
*/
GrafickiObjekat krug1;
krug1.pos = (Tacka*)malloc(sizeof(Tacka));
krug1.bpos = 1;
krug1.pos->x = 234;
krug1.pos->y = 543;
krug1.dim = (int*)malloc(sizeof(int));
krug1.bdim = 1;
(*krug1.dim) = 30;
krug1.draw = crtaj_loptu;
add(krug1);
/*...*/
draw();
exit(0);
}

probaj ga
PS:Kako da stavim Code tagove:)


[Ovu poruku je menjao Dragi Tata dana 12.03.2002 u 08:53 AM GMT]
[ Dragi Tata @ 12.03.2002. 16:52 ] @
Izbegavaj da koristiš i kao index, jer će forum da protumači to kao italic...
[ tosa @ 12.03.2002. 18:43 ] @
C++ je idealan jezik za 3D.
A sto se virtuelnih metoda tice, one mogu da uspore stvari nekih 0.5% MAX ...
Pre svega bitno je na koji se nacin manipulise podacima. Ako se non stop pozivaju
virtuelni metodi (npr. za rendering SVAKOG trougla) onda to i nije dobro.
Ali upravo zbog toga se to i ne radi tako...

Hocu da kazem sledece: sa pointerima na f-je imas (veoma malo) brzi kod ali
zato znacajno ruzniji kod.
Ono sto radis sa virtuelnim metodima se i onako svodi na minimum u "engine"-u
(na primeru poligona to bi bilo formiranje display listi koje bi onda renderovao).
Dakle uvedes cache za geometriju i zaboravis na virtual call penalty :)

Pre svega ne treba juriti optimizaciju na nivou poziva funkcija.
Sa danasnjim hardware-om mnogo je bitnije kako ces da eliminises sto
vise poligona pre nego sto uopste dodjes do renderinga i transformacija...

tosa

ps. ja volim C ali za 3D je C++ kao stvoren.
programirao sam 3D grafiku u paskalu, asembleru, C-u i C++-u
tako da znam da valja :)
[ Dragi Tata @ 12.03.2002. 18:52 ] @
I ja bih uvek izabrao C++. U stvari, radio sam pre 4 godine neki CAD projekat baziran na OpenGL-u i tada smo sve bazirali na MFC-u, što je bila greška. Sada bih maksimalno koristio STL kontejnere i algoritme, čak i ako bih rešio da ne koristim run-time polimorfizam (zbog gorepomenutog virtual call usporavanja). A sad da li bi to usporilo 0.5% ili više to se nikad ne zna dok se ne izmeri...