END_TEST START_TEST(test_material_info) { CX_LogContext *sink = CX_log_open_null(); EON_Mat *M = EON_MatCreate(); EON_MatInfo(M, sink); // FIXME EON_MatDelete(M); CX_log_close(sink); }
int main(int argc, char *argv[]) { int err = 0; int frames = 0; time_t start = 0; time_t stop = 0; EON_Light *light; EON_Obj *model; EON_Mat *material; EON_Cam *camera; EON_Rend *rend; EON_Frame *frame; EONx_Console *console; EONViewer view; view.logger = CX_log_open_console(CX_LOG_MARK, stderr); opts_Defaults(&view.opts); err = opts_Parse(&view.opts, argc, argv); if (err) { return opts_ErrCode(err); } CX_log_trace(view.logger, CX_LOG_INFO, EXE, "Shading mode: %s", shade_ModeToStr(view.opts.shade)); CX_log_trace(view.logger, CX_LOG_INFO, EXE, "Frame Size: %ix%i", view.opts.width, view.opts.height); CX_log_trace(view.logger, CX_LOG_INFO, EXE, "Model rotation: X=%f Y=%f Z=%f", view.opts.rx, view.opts.ry, view.opts.rz); EONx_ConsoleStartup("Eon3D Model Viewer", NULL); material = EON_MatCreate(); material->ShadeType = view.opts.shade; material->Ambient.R = 200; material->Ambient.G = 200; material->Ambient.B = 200; EON_MatInit(material); EON_MatInfo(material, view.logger); console = EONx_ConsoleCreate(view.opts.width, view.opts.height, 90); EONx_ConsoleBindEventKey(console, 's', onkey_Screenshot, &view); // XXX EONx_ConsoleBindEventKey(console, 'q', onkey_Quit, &view); // XXX model = EONx_ReadPLYObj(view.opts.filename, material); EON_ObjInfo(model, view.logger); frame = EONx_ConsoleGetFrame(console); camera = EONx_ConsoleGetCamera(console); camera->Pos.Z = -view.opts.distance; light = EON_LightNew(EON_LIGHT_VECTOR, 0.0, 0.0, 0.0, 1.0, 1.0); rend = EON_RendCreate(camera); start = time(NULL); while (!EONx_ConsoleNextEvent(console)) { model->Xa += view.opts.rx; model->Ya += view.opts.ry; model->Za += view.opts.rz; EONx_ConsoleClearFrame(console); EON_RenderBegin(rend); EON_RenderLight(rend, light); EON_RenderObj(rend, model); EON_RenderEnd(rend, frame); EONx_ConsoleShowFrame(console); frames++; } stop = time(NULL); CX_log_trace(view.logger, CX_LOG_INFO, EXE, "%i frames in %f seconds: %.3f FPS\n", frames, (double)stop-(double)start, (double)frames/((double)stop-(double)start)); return EONx_ConsoleShutdown(); }
void world_setupLandscape(World *W, CX_LogContext *Logger) { int i; W->landMat = EON_MatCreate(); W->landMat->ShadeType = EON_SHADE_GOURAUD_DISTANCE; W->landMat->Shininess = 1; W->landMat->Ambient.R = 12;//255; W->landMat->Ambient.G = 200;//255; W->landMat->Ambient.B = 5;//255; W->landMat->Diffuse.R = 127; W->landMat->Diffuse.G = 127; W->landMat->Diffuse.B = 127; W->landMat->Specular.R = 127; W->landMat->Specular.G = 127; W->landMat->Specular.B = 127; W->landMat->FadeDist = 10000.0; W->landMat->PerspectiveCorrect = 16; EON_MatInit(W->landMat); EON_MatInfo(W->landMat, Logger); W->skyMat = EON_MatCreate(); W->skyMat->ShadeType = EON_SHADE_GOURAUD_DISTANCE; W->skyMat->Shininess = 1; W->skyMat->Ambient.R = 5;//255; W->skyMat->Ambient.G = 12;//255; W->skyMat->Ambient.B = 60;//255; W->skyMat->Diffuse.R = 127; W->skyMat->Diffuse.G = 127; W->skyMat->Diffuse.B = 127; W->skyMat->Specular.R = 127; W->skyMat->Specular.G = 127; W->skyMat->Specular.B = 127; W->skyMat->FadeDist = 10000.0; W->skyMat->PerspectiveCorrect = 32; EON_MatInit(W->skyMat); EON_MatInfo(W->skyMat, Logger); // make our root object the land W->land = EON_MakePlane(LAND_SIZE, LAND_SIZE, LAND_DIV-1, W->landMat); // give it a nice random bumpy effect for (i = 0; i < W->land->NumVertices; i ++) { W->land->Vertices[i].y += (float) (rand()%1400)-700; /* if (i % 2 == 0) { W->land->Vertices[i].y += (float) (rand()%400)-200; } if (i % 4 == 0) { W->land->Vertices[i].y += (float) (rand()%400)-200; } if (i % 6 == 0) { W->land->Vertices[i].y += (float) (rand()%400)-200; } if (i % 8 == 0) { W->land->Vertices[i].y += (float) (rand()%400)-200; } */ } for (i = 1; i < W->land->NumVertices-1; i ++) { W->land->Vertices[i].y = (W->land->Vertices[i-1].y + W->land->Vertices[i ].y + W->land->Vertices[i+1].y) /3; } // gotta recalculate normals for backface culling to work right EON_ObjCalcNormals(W->land); // Make our first child the first sky W->sky = EON_MakePlane(LAND_SIZE, LAND_SIZE, 1, W->skyMat); W->sky->Yp = 2000; W->sky->BackfaceCull = 0; EON_ObjInfo(W->land, Logger); EON_ObjInfo(W->sky, Logger); return; }
void setup_materials(EONx_Console *con, EON_Mat **mat, CX_LogContext *Logger) { // create our 3 materials, make the fourth null so that EON_MatMakeOptPal2() // knows where to stop mat[0] = EON_MatCreate(); mat[1] = EON_MatCreate(); mat[2] = EON_MatCreate(); mat[3] = 0; // set up material 0 (the ground) mat[0]->ShadeType = EON_SHADE_GOURAUD_DISTANCE; mat[0]->Shininess = 1; mat[0]->Ambient.R = 255; mat[0]->Ambient.G = 255; mat[0]->Ambient.B = 255; mat[0]->Diffuse.R = 127; mat[0]->Diffuse.G = 127; mat[0]->Diffuse.B = 127; mat[0]->Specular.R = 127; mat[0]->Specular.G = 127; mat[0]->Specular.B = 127; mat[0]->FadeDist = 10000.0; mat[0]->Texture = EONx_ReadPCXTex("ground.pcx"); mat[0]->TexScaling = 40.0*LAND_SIZE/50000; mat[0]->PerspectiveCorrect = 16; EON_TexInfo(mat[0]->Texture, Logger); // set up material 1 (the sky) mat[1]->ShadeType = EON_SHADE_GOURAUD_DISTANCE; mat[1]->Shininess = 1; mat[1]->Ambient.R = 255; mat[1]->Ambient.G = 255; mat[1]->Ambient.B = 255; mat[1]->Diffuse.R = 127; mat[1]->Diffuse.G = 127; mat[1]->Diffuse.B = 127; mat[1]->Specular.R = 127; mat[1]->Specular.G = 127; mat[1]->Specular.B = 127; mat[1]->FadeDist = 10000.0; mat[1]->Texture = EONx_ReadPCXTex("sky.pcx"); mat[1]->TexScaling = 45.0*LAND_SIZE/50000; mat[1]->PerspectiveCorrect = 32; EON_TexInfo(mat[1]->Texture, Logger); // set up material 2 (the second sky) mat[2]->ShadeType = EON_SHADE_NONE; mat[2]->Shininess = 1; mat[2]->Texture = EONx_ReadPCXTex("sky2.pcx"); mat[2]->TexScaling = 10.0; //200.0*LAND_SIZE/50000; mat[2]->PerspectiveCorrect = 2; EON_TexInfo(mat[2]->Texture, Logger); // intialize the materials EON_MatInit(mat[0]); EON_MatInfo(mat[0], Logger); EON_MatInit(mat[1]); EON_MatInfo(mat[1], Logger); EON_MatInit(mat[2]); EON_MatInfo(mat[2], Logger); return; }
int main(int argc, char *argv[]) { const char *filename; int frames = 0; int framenum = 100000; time_t start = 0, stop = 0; // Our variables EON_Light *TheLight; // Our light EON_Mesh *TheModel; // Our cube object EON_Mat *ModelMat; // The material for the cube EON_Cam *TheCamera; EON_Rend *TheRend; EON_Frame *TheFrame; NullConsole *TheConsole; double distance = 50; int ch = -1; int verbose = 1; CX_LogContext *Logger = CX_log_open_console(CX_LOG_MARK, stderr); while (1) { ch = getopt(argc, argv, "d:n:v:h?"); if (ch == -1) { break; } switch (ch) { case 'd': distance = atof(optarg); break; case 'n': framenum = atoi(optarg); break; case 'v': verbose = atoi(optarg); break; case '?': /* fallthrough */ case 'h': /* fallthrough */ default: usage(); return 0; } } /* XXX: watch out here */ argc -= optind; argv += optind; if (argc != 1) { usage(); return 1; } filename = argv[0]; if (verbose) { CX_log_trace(Logger, CX_LOG_INFO, EXE, "settings> rendering model = %s", filename); CX_log_trace(Logger, CX_LOG_INFO, EXE, "settings> frame limit = %i", framenum); } ModelMat = EON_MatCreate(); ModelMat->ShadeType = EON_SHADE_FLAT; ModelMat->Ambient.R = 216; ModelMat->Ambient.G = 216; ModelMat->Ambient.B = 216; EON_MatInit(ModelMat); EON_MatInfo(ModelMat, Logger); TheConsole = NullConsoleCreate(800, // Screen width 600 // Screen height ); TheModel = EONx_ReadPLYMesh(filename, ModelMat); if (TheModel == NULL) { CX_log_trace(Logger, CX_LOG_ERROR, EXE, "failed to load model '%s', aborting", filename); return 1; } EON_MeshInfo(TheModel, Logger); TheFrame = TheConsole->fb; TheCamera = TheConsole->cam; TheCamera->Pos.Z = -distance; // Back the camera up from the origin TheLight = EON_LightNew(EON_LIGHT_VECTOR, // vector light 0.0, 0.0, 0.0, // rotation angles 1.0, // intensity 1.0); // falloff, not used for vector lights TheRend = EON_RendCreate(TheCamera); start = time(NULL); while (frames < framenum) { // Rotate by 1 degree on each axis TheModel->Rotation.X += 1.0; TheModel->Rotation.Y += 1.0; TheModel->Rotation.Z += 1.0; NullConsoleClearFrame(TheConsole); EON_RenderBegin(TheRend); // Start rendering with the camera EON_RenderLight(TheRend, TheLight); // Render our light EON_RenderMesh(TheRend, TheModel); // Render our object EON_RenderEnd(TheRend, TheFrame); // Finish rendering frames++; } stop = time(NULL); CX_log_trace(Logger, CX_LOG_INFO, EXE, "%i frames in %f seconds: %.3f FPS", frames, (double)stop-(double)start, (double)frames/((double)stop-(double)start)); return CX_log_close(Logger); }