示例#1
0
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;
}
示例#2
0
文件: student.c 项目: v-bayer/bcFIT
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;
}
示例#3
0
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;
}
示例#4
0
S_Renderer * renCreate()
{
    S_Renderer * renderer = (S_Renderer *)malloc(sizeof(S_Renderer));
    IZG_CHECK(renderer, "Cannot allocate enough memory");

    renInit(renderer);
    return renderer;
}
示例#5
0
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;
}
示例#6
0
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;
}
示例#7
0
文件: student.c 项目: zcsevcik/edu
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;
}
示例#8
0
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);
}
示例#9
0
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;
}
示例#10
0
文件: main.c 项目: pavelfryz/fit
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;
}
示例#11
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;
}