void renCreateBuffers(S_Renderer *pRenderer, int width, int height) { S_RGBA * new_frame_buffer; double * new_depth_buffer; IZG_ASSERT(pRenderer && width > 0 && height > 0); /* alokace pameti frame bufferu */ new_frame_buffer = (S_RGBA *)realloc(pRenderer->frame_buffer, width * height * sizeof(S_RGBA)); IZG_CHECK(new_frame_buffer, "Cannot allocate frame buffer"); /* vymazani obsahu frame bufferu */ memset(new_frame_buffer, 0, width * height * sizeof(S_RGBA)); /* nastaveni nove velikosti frame bufferu */ pRenderer->frame_buffer = new_frame_buffer; pRenderer->frame_w = width; pRenderer->frame_h = height; /* alokace pameti depth bufferu */ new_depth_buffer = (double *)realloc(pRenderer->depth_buffer, width * height * sizeof(double)); IZG_CHECK(new_depth_buffer, "Cannot allocate depth buffer"); /* vymazani obsahu depth bufferu */ memset(new_depth_buffer, 0, width * height * sizeof(double)); /* nastaveni ukazatele */ pRenderer->depth_buffer = new_depth_buffer; }
S_Renderer * studrenCreate() { S_StudentRenderer * renderer = (S_StudentRenderer *)malloc(sizeof(S_StudentRenderer)); IZG_CHECK(renderer, "Cannot allocate enough memory"); /* inicializace default rendereru */ renderer->base.type = STUDENT_RENDERER; renInit(&renderer->base); /* nastaveni ukazatelu na upravene funkce */ /* napr. renderer->base.releaseFunc = studrenRelease; */ /* ??? */ renderer->base.releaseFunc = studrenRelease; renderer->base.createBuffersFunc = studrenCreateBuffers; renderer->base.clearBuffersFunc = studrenClearBuffers; renderer->base.projectTriangleFunc = studrenProjectTriangle; renderer->vecHeadBuff = NULL; renderer->vecNodeBuff = NULL; /* inicializace nove pridanych casti */ /* ??? */ return (S_Renderer *)renderer; }
S_Vector * vecCreateEmpty(int elemSize) { S_Vector * vec = (S_Vector *)malloc(sizeof(S_Vector)); IZG_CHECK(vec, "Cannot allocate enough memory"); vecInit(vec, elemSize); return vec; }
S_Renderer * renCreate() { S_Renderer * renderer = (S_Renderer *)malloc(sizeof(S_Renderer)); IZG_CHECK(renderer, "Cannot allocate enough memory"); renInit(renderer); return renderer; }
S_Curve * curveCreate() { S_Curve * curve = (S_Curve *)malloc(sizeof(S_Curve)); IZG_CHECK(curve, "Cannot allocate enough memory"); curve->points = cvecCreateEmpty(); curve->weights = dvecCreateEmpty(); curve->knots = dvecCreateEmpty(); curve->degree = 2; return curve; }
void vecResize(S_Vector *pVec, int size) { IZG_ASSERT(pVec && size >= 0); if( size > pVec->reserved || size < (pVec->reserved >> 1) ) { char *p = (char *)realloc(pVec->data, size * pVec->elemSize); IZG_CHECK(p, "Cannot allocate enough memory"); pVec->data = p; pVec->reserved = size; } pVec->size = size; }
S_Renderer * studrenCreate() { S_StudentRenderer * renderer = (S_StudentRenderer *)malloc(sizeof(S_StudentRenderer)); IZG_CHECK(renderer, "Cannot allocate enough memory"); /* inicializace default rendereru */ renInit(&renderer->base); /* nastaveni ukazatelu na vase upravene funkce */ renderer->base.projectTriangleFunc = studrenProjectTriangle; renderer->base.calcReflectanceFunc = studrenPhongReflectance; /* vychozi koeficient ostrosti -- nastavime jako u referencniho reseni */ renderer->mat_shininess = 1.0f; //renderer->mat_shininess = 10.0f; return (S_Renderer *)renderer; }
int vecPushBack(S_Vector *pVec, void *pElem) { static const int blockSize = 512; IZG_ASSERT(pVec && pElem); if( pVec->size >= pVec->reserved ) { char *p = (char *)realloc(pVec->data, (pVec->size + blockSize) * pVec->elemSize); IZG_CHECK(p, "Cannot allocate enough memory"); pVec->data = p; pVec->reserved = pVec->size + blockSize; } MEMCOPY(pVec->data + pVec->size * pVec->elemSize, pElem, pVec->elemSize); ++pVec->size; return (pVec->size - 1); }
S_Renderer * studrenCreate() { S_StudentRenderer * renderer = (S_StudentRenderer *)malloc(sizeof(S_StudentRenderer)); IZG_CHECK(renderer, "Cannot allocate enough memory"); /* inicializace default rendereru */ renderer->base.type = STUDENT_RENDERER; renInit(&renderer->base); /* nastaveni ukazatelu na upravene funkce */ /* napr. renderer->base.releaseFunc = studrenRelease; */ renderer->base.releaseFunc = studrenRelease; renderer->base.projectTriangleFunc = studrenProjectTriangle; /* inicializace nove pridanych casti */ int width, height; S_RGBA *texture = loadBitmap(TEXTURE_FILENAME, &width, &height); renderer->height = height; renderer->width = width; renderer->texture = texture; return (S_Renderer *)renderer; }
int main(int argc, char *argv[]) { SDL_Event event; /* nacteni modelu */ polymodel = modLoad((argc == 2) ? argv[1] : DEFAULT_MODEL); IZG_CHECK(polymodel, "Failed to read input model"); /* vytvoreni SW rendereru */ #ifdef USE_STUDENT_RENDERER renderer = studrenCreate(); #else renderer = renCreate(); #endif /* USE_STUDENT_RENDERER */ /* pocatecni velikost bufferu */ renderer->createBuffersFunc(renderer, DEFAULT_WIDTH, DEFAULT_HEIGHT); /* inicializace SDL knihovny */ if( SDL_Init(SDL_INIT_VIDEO) == -1 ) { IZG_SDL_ERROR("Could not initialize SDL library"); } /* nasteveni okna */ SDL_WM_SetCaption(PROGRAM_TITLE, 0); /* screen */ screen = SDL_SetVideoMode(DEFAULT_WIDTH, DEFAULT_HEIGHT, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_RESIZABLE); /* enable Unicode translation */ SDL_EnableUNICODE(1); /* kreslime dokud nenarazime na SDL_QUIT event */ while( !quit ) { /* vycteni udalosti */ while( SDL_PollEvent(&event) ) { switch( event.type ) { /* udalost klavesnice */ case SDL_KEYDOWN: onKeyboard(&event.key); break; /* zmena velikosti okna */ case SDL_VIDEORESIZE: onResize(&event.resize); break; /* udalost mysi */ case SDL_MOUSEMOTION: onMouseMotion(&event.motion); break; /* SDL_QUIT event */ case SDL_QUIT: quit = 1; break; default: break; } } /* vykresleni pres SDL knihovnu */ draw(); } /* ukonceni SDL */ SDL_FreeSurface(screen); /* shutdown all SDL subsystems */ SDL_Quit(); /* zrusime co jsme vytvorili a ukoncime program */ modRelease(&polymodel); renderer->releaseFunc(&renderer); return 0; }
int main(int argc, char *argv[]) { SDL_Event event; SDL_TimerID timer = 0; /* nacteni modelu */ polymodel = modLoad((argc == 2) ? argv[1] : DEFAULT_MODEL); IZG_CHECK(polymodel, "Failed to read input model"); /* vytvoreni default SW rendereru */ #ifdef USE_STUDENT_RENDERER renderer = studrenCreate(); #else renderer = renCreate(); #endif /* USE_STUDENT_RENDERER */ /* pocatecni velikost bufferu */ renderer->createBuffersFunc(renderer, DEFAULT_WIDTH, DEFAULT_HEIGHT); /* inicializace SDL knihovny */ if( SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) == -1 ) { IZG_SDL_ERROR("Could not initialize SDL library"); } /* nastaveni titulku okna */ #ifdef USE_STUDENT_RENDERER SDL_WM_SetCaption(PROGRAM_TITLE_STUDENT, 0); #else SDL_WM_SetCaption(PROGRAM_TITLE, 0); #endif // USE_STUDENT_RENDERER /* screen */ screen = SDL_SetVideoMode(DEFAULT_WIDTH, DEFAULT_HEIGHT, 32, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_RESIZABLE); /* enable Unicode translation */ SDL_EnableUNICODE(1); /* dalsi inicializace */ onInit(renderer, polymodel); /* nastavime timer, ktery bude volat zadanou callback fci */ timer = SDL_AddTimer(TIMER_INTERVAL, timerCallback, NULL); /* kreslime dokud nenarazime na SDL_QUIT event */ while( !quit ) { /* vycteni udalosti */ while( SDL_PollEvent(&event) ) { switch( event.type ) { /* udalost klavesnice */ case SDL_KEYDOWN: onKeyboard(&event.key); break; /* zmena velikosti okna */ case SDL_VIDEORESIZE: onResize(&event.resize); break; /* udalost mysi - pohyb */ case SDL_MOUSEMOTION: onMouseMotion(&event.motion); break; /* udalost mysi - tlacitka */ case SDL_MOUSEBUTTONDOWN: case SDL_MOUSEBUTTONUP: onMouseButton(&event.button); break; /* tiknuti timeru */ case SDL_USEREVENT: if( event.user.code == IZG_TIMER_EVENT ) { onTimer((int)SDL_GetTicks()); } break; /* SDL_QUIT event */ case SDL_QUIT: quit = 1; break; default: break; } } /* vykresleni pres SDL knihovnu */ draw(); } /* ukonceni timeru */ SDL_RemoveTimer(timer); /* ukonceni SDL */ SDL_FreeSurface(screen); /* shutdown all SDL subsystems */ SDL_Quit(); /* zrusime co jsme vytvorili a ukoncime program */ modRelease(&polymodel); renderer->releaseFunc(&renderer); return 0; }