Mercurial > hg > Members > kono > Cerium
diff TaskManager/Test/simple_render/viewer.cpp @ 26:3f68b2ef4fb0
*** empty log message ***
author | gongo |
---|---|
date | Sun, 10 Feb 2008 18:31:48 +0900 |
parents | |
children | 243ee0a1fe6f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TaskManager/Test/simple_render/viewer.cpp Sun Feb 10 18:31:48 2008 +0900 @@ -0,0 +1,460 @@ +#include <iostream> +#include <SDL.h> +#include <SDL_opengl.h> +#include <math.h> +#include "polygon.h" +//#include "demonstration.h" +//#include "scene.h" +#include "viewer.h" +#include "sys.h" +using namespace std; + +extern int create_sgp(SceneGraphPack *sgp, Polygon *sg); +extern int update_sgp(SceneGraphPack *sgp, SceneGraphPack *_sgp); +extern int create_pp(PolygonPack *pp, SceneGraphPack *sgp); + +Viewer::Viewer(int b, int w, int h) +{ + bpp = b; + width = w; + height = h; +} + + +void Viewer::sdl_init() +{ + if( SDL_Init( SDL_INIT_VIDEO ) < 0 ) + { + fprintf(stderr,"Couldn't initialize SDL: %s\n",SDL_GetError()); + exit( 1 ); + } + screen = SDL_SetVideoMode( width, height, bpp, SDL_HWSURFACE ); + + //manager = new TaskManager(1); + //manager->init(); + + manager->set_symbol("CreateSGP", (void*)create_sgp); + manager->set_symbol("UpdateSGP", (void*)update_sgp); + manager->set_symbol("CreatePP", (void*)create_pp); +} + + +void Viewer::init() +{ + if(SDL_Init( SDL_INIT_VIDEO ) < 0) + { + cout << "Couldn't initialize SDL:" << SDL_GetError() << endl; + exit(1); + } + + /* See if we should detect the display depth */ + if(bpp == 0) + { + if (SDL_GetVideoInfo()->vfmt->BitsPerPixel <= 8) + { + bpp = 8; + } + else + { + bpp = 16; /* More doesn't seem to work */ + } + } + + //video_flags = SDL_OPENGL; + video_flags = SDL_HWSURFACE; + + /* Initialize the display */ + switch (bpp) + { + case 8: + rgb_size[0] = 3; + rgb_size[1] = 3; + rgb_size[2] = 2; + break; + case 15: + case 16: + rgb_size[0] = 5; + rgb_size[1] = 5; + rgb_size[2] = 5; + break; + default: + rgb_size[0] = 8; + rgb_size[1] = 8; + rgb_size[2] = 8; + break; + } + + SDL_GL_SetAttribute(SDL_GL_RED_SIZE, rgb_size[0]); + SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, rgb_size[1]); + SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, rgb_size[2]); + SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); + SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); + + SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 0); + + screen = SDL_SetVideoMode(width, height, bpp, video_flags); + + if(screen == NULL) + { + cout << "Couldn't set GL mode: " << SDL_GetError() << endl; + SDL_Quit(); + exit(1); + } + + SDL_WM_SetCaption("SDL GL test", "testgl"); + + glViewport(0, 0, width, height); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + glOrtho(-width/10, width/10, -height/10, height/10, -40.0, 400.0); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glEnable(GL_DEPTH_TEST); + + glDepthFunc(GL_LESS); + + glShadeModel(GL_SMOOTH); +} + +int Viewer::get_ticks() +{ + int time; + time = SDL_GetTicks(); + return time; +} + +bool Viewer::quit_check() +{ + bool quit = false; + SDL_Event event; + while(SDL_PollEvent(&event)) + { + if(event.type==SDL_QUIT) + { + quit = true; + return quit; + } + } + return quit; +} + +void Viewer::quit() +{ + SDL_Quit(); +} + + +void Viewer::swap_buffers() +{ + SDL_GL_SwapBuffers(); +} + + +void Viewer::write_pixel(int x, int y,float z, Uint32 rgb) { + SDL_PixelFormat *pf; + pf = screen->format; + //printf("x:%d y:%d z:%d\n",x,y,z); + + //cout << "write_pixel" << endl; + //cout << x << " " << y << endl; + + //cout << SDL_MapRGB(pf,0,0,150) << endl; + + x += width/2; + y += height/2; + + static int diffz,diffz1; + diffz1 = diffz; + diffz = (zRow[x][y]>z); + if(diffz != diffz1) { + //printf("diffz :%d zRow[%d][%d] = %f z = %f\n",diffz,x,y,zRow[x][y],z); + } + //printf("x:%d,y:%d,z:%f,zRow:%f\n",x,y,z,zRow[x][y]); + if(z < zRow[x][y]) { +// printf("x:%d,y:%d,z:%d\n",x,y,z,zRow); + if(x < width && x > 0 && y > 0 && y < height) + { + //pixels[width*y + x] = SDL_MapRGB(pf,70,70,71); + zRow[x][y] = z; + y = height - y; + pixels[width*y + x] = rgb; + } + } +} + +void Viewer::write_line(float x1, float y1, float x2, float y2, Uint32 rgb) +{ + //cout << "write_line("<< x1 << "," << y1 << "," << x2 << "," << y2 << ")"<< endl; + + //Uint32 rgb = 9830400; + + if(x1 > x2) + { + float x=0; + float y=0; + x=x1; + y=y1; + x1 = x2; + y1 = y2; + x2 = x; + y2 = y; + } + float s = y1; + + if((int)x1 == (int)x2) + { + if(y1 > y2) + { + float y=0; + y = y1; + y1 = y2; + y2 = y; + } + for(float i=y1; i<y2; i++) + { + //write_pixel((int)x1,(int)i); + write_pixel((int)x1,(int)i,0,rgb); + } + } + else + { + float t = (y2 - y1)/(x2 - x1); + if(t < -1) + { + float f = 0; + for(float i=x1; i<x2; i++) + { + for(float a=(int)t; a<0; a++) + { + //write_pixel((int)i,(int)s); + write_pixel((int)i,(int)s,0,rgb); + s--; + } + f += t-(int)t; + if(f <= -1) + { + //write_pixel((int)i,(int)s); + write_pixel((int)i,(int)s,0,rgb); + f = 0; + s--; + } + } + } + else if(t <= 1) + { + for(float i=x1; i<x2; i++) + { + //write_pixel((int)i,(int)s); + write_pixel((int)i,(int)s,0,rgb); + s += t; + } + } + else + { + float f = 0; + for(float i=x1; i<x2; i++) + { + for(float a=0; a<(int)t; a++) + { + //write_pixel((int)i,(int)s); + write_pixel((int)i,(int)s,0,rgb); + s++; + } + f += t-(int)t; + if(f >= 1) + { + //write_pixel((int)i,(int)s); + write_pixel((int)i,(int)s,0,rgb); + f = 0; + s++; + } + } + } + } +} + +void Viewer::write_triangle(float x1, float y1, float x2, float y2, float x3, float y3, Uint32 rgb) +{ + write_line(x1,y1,x2,y2,rgb); + write_line(x2,y2,x3,y3,rgb); + write_line(x3,y3,x1,y1,rgb); +} + +void Viewer::clean_pixels() +{ + for(int i=0; i<width*height; i++) + { + pixels[i] = 0x00; + } +} + +void Viewer::graph_line() +{ + int xl = width*height/2; + int yl = width/2; + for(int i=0; i<width; i++) + { + for(int t=0; t<height; t+=20) + { + pixels[width*t+i] = 0x5a; + } + pixels[xl +i] = 0xff; + } + for(int i=0; i<height; i++) + { + for(int t=0; t<width; t+=20) + { + pixels[i*width+t] = 0x5a; + } + pixels[i*width+yl] = 0xff; + } +} + + +void Viewer::run() +{ + int frames = 0; + int start_time, this_time; + + HTaskPtr task_update_sgp = NULL; + HTaskPtr task_create_pp = NULL; + int fd_update_sgp; + int fd_create_pp; + + start_time = get_ticks(); + + SDL_Surface *bitmap = NULL; + SDL_PixelFormat *pf; + pf = screen->format; + + Uint32 background; + background = SDL_MapRGB(screen->format, 0x00, 0x00, 0x00); + + pixels = new Uint32[width*height]; + + Polygon *p = new Polygon; + p->set_data("cube.xml"); + //p->set_data("cube-p.xml"); + + p->viewer = this; + //p->screen = screen; + /* + p->next->viewer = this; + p->next->next->viewer = this; + p->next->next->next->viewer = this; + p->next->next->next->next->viewer = this; + p->next->next->next->next->next->viewer = this; + p->next->next->next->next->next->next->viewer = this; + p->next->next->next->next->next->next->next->viewer = this; + p->next->next->next->next->next->next->next->next->viewer = this; + p->next->next->next->next->next->next->next->next->next->viewer = this; + */ + + SceneGraphPack *sgp = new SceneGraphPack; + create_sgp(sgp,p); + + PolygonPack *pp = new PolygonPack; + + graph_line(); + + float r = 0; + float x = 0; + float y = 0; + float z = 0; + + // Loop until done. + while(1) + { + // Destroy our GL context, etc. + //if(quit_check() || scene->action_scene==NULL) + if(quit_check()) + { + this_time = get_ticks(); + if (this_time != start_time) + { + cout<<((float)frames/(this_time-start_time))*1000.0<<" FPS\n"; + } + SDL_FreeSurface(bitmap); + delete pixels; + p->delete_data(); + delete p; + delete sgp; + delete pp; + quit(); + break; + } + ///////////////////// + clean_pixels(); + + this->zRow_init(); + graph_line(); + + if(r > 360) r = 0; + r+= 1.0; + // r= 0; + p->angle[0] = 0; + p->angle[1] = r; + p->angle[2] = 0; + //p->child->angle[1] = r*2; + //p->child->brother->angle[1] = r*3; + //p->child->brother->child->angle[1] = r*4; + x += 0.5; + y += 0.5; + z += 0.5; + //p->xyz[0] = x; + //p->xyz[1] = y; + //p->xyz[2] = z; + //p->tree_draw(); + + + update_sgp(sgp, sgp); + //create_pp(pp, sgp); + + //fd_update_sgp = manager->open("UpdateSGP"); + fd_create_pp = manager->open("CreatePP"); +#if 1 + //task_update_sgp = manager->create_task(fd_update_sgp, + //sizeof(SceneGraphPack), + //(unsigned int)sgp, + // (unsigned int)sgp, + //NULL); + + task_create_pp = manager->create_task(fd_create_pp, + sizeof(SceneGraphPack), + (unsigned int)sgp, + (unsigned int)pp, + NULL); + //manager->set_task_depend(task_update_sgp, task_create_pp); + //manager->spawn_task(task_update_sgp); + manager->spawn_task(task_create_pp); + + manager->run(); +#endif + //p->draw(sgp); + p->draw(pp); + + bitmap = SDL_CreateRGBSurfaceFrom((void *)pixels,width,height,32,width*4,0x00ff0000,0x0000ff00,0x000000ff,0); + SDL_FillRect(screen, NULL, background); + SDL_BlitSurface(bitmap,NULL,screen,NULL); + SDL_UpdateRect(screen,0,0,0,0); + + + ///////////////////// + + //swap_buffers(); + ++frames; + } +} + +void Viewer::zRow_init() { + int i,j; + for(i = 0;i < 640; i++) { + for(j = 0; j < 480; j++) { + zRow[i][j] = 65535; + } + } +}