예제 #1
0
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);
}
예제 #2
0
파일: eonview.c 프로젝트: feed3r/Eon3D
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();
}
예제 #3
0
파일: landgen.c 프로젝트: feed3r/Eon3D
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;
}
예제 #4
0
파일: example_fly.c 프로젝트: feed3r/Eon3D
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;
}
예제 #5
0
파일: benchmark.c 프로젝트: mojaves/Eon3D
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);
}