void Mesh::EnableSpecialFX(){
  draw_sequence=MESH_SPECIAL_FX_ONLY;
  setEnvMap(GFXFALSE);
  setLighting (GFXTRUE);
  if (orig) {
    orig->draw_sequence=MESH_SPECIAL_FX_ONLY;
    orig->blendSrc = orig->blendDst= ONE;
    orig->setEnvMap( GFXFALSE);
    orig->setLighting (GFXTRUE);
  }
  blendSrc=ONE;
  blendDst=ONE;
}
示例#2
0
Box::Box( const Vector &corner1, const Vector &corner2 ) : corner_min( corner1 )
    , corner_max( corner2 )
{
    InitUnit();
    draw_sequence = 3;
    setEnvMap( GFXFALSE );
    blendSrc = ONE;
    blendDst = ONE;
    Box   *oldmesh;
    string hash_key = string( "@@Box" )+"#"+tostring( corner1 )+"#"+tostring( corner2 );
    //cerr << "hashkey: " << hash_key << endl;
    if ( 0 != ( oldmesh = (Box*) meshHashTable.Get( hash_key ) ) ) {
        *this = *oldmesh;
        oldmesh->refcount++;
        orig  = oldmesh;
        return;
    }
    int a = 0;
    GFXVertex *vertices = new GFXVertex[18];
    
#define VERTEX( ax, ay, az ) \
    do {vertices[a].x = ax;  \
        vertices[a].y = ay;  \
        vertices[a].z = az;  \
        vertices[a].i = ax;  \
        vertices[a].j = ay;  \
        vertices[a].k = az;  \
        vertices[a].s = 0;   \
        vertices[a].t = 0;   \
        a++;                 \
    }                        \
    while (0)

    VERTEX( corner_max.i, corner_min.j, corner_max.k );
    VERTEX( corner_min.i, corner_min.j, corner_max.k );
    VERTEX( corner_min.i, corner_min.j, corner_min.k );
    VERTEX( corner_max.i, corner_min.j, corner_min.k );

    VERTEX( corner_max.i, corner_max.j, corner_min.k );
    VERTEX( corner_min.i, corner_max.j, corner_min.k );
    VERTEX( corner_min.i, corner_max.j, corner_max.k );
    VERTEX( corner_max.i, corner_max.j, corner_max.k );

    a = 8;

    VERTEX( corner_max.i, corner_min.j, corner_max.k );
    VERTEX( corner_min.i, corner_min.j, corner_max.k );
    VERTEX( corner_min.i, corner_max.j, corner_max.k );
    VERTEX( corner_max.i, corner_max.j, corner_max.k );

    VERTEX( corner_max.i, corner_max.j, corner_min.k );
    VERTEX( corner_min.i, corner_max.j, corner_min.k );

    VERTEX( corner_min.i, corner_min.j, corner_min.k );
    VERTEX( corner_max.i, corner_min.j, corner_min.k );

    VERTEX( corner_max.i, corner_min.j, corner_max.k );
    VERTEX( corner_min.i, corner_min.j, corner_max.k );

    int offsets[2];
    offsets[0] = 8;
    offsets[1] = 10;
    enum POLYTYPE polys[2];
    polys[0]   = GFXQUAD;
    polys[1]   = GFXQUADSTRIP;
    vlist = new GFXVertexList( polys, 18, vertices, 2, offsets );
    //quadstrips[0] = new GFXVertexList(GFXQUADSTRIP,10,vertices);
    delete[] vertices;

    meshHashTable.Put( hash_key, this );
    orig = this;
    refcount++;
    draw_queue = new vector< MeshDrawContext >[NUM_ZBUF_SEQ+1];
#undef VERTEX
}
 void Ex_004_ShadowMapping::run() {
     const string path = "/Users/saburookita/Personal Projects/Three.cpp Rev.2/examples/assets/";
     
     ForwardRenderer renderer;
     renderer.init( "Ex 004: Shadow Mapping", 1600 * 2 / 4, 900 * 2 / 4 );
     renderer.setCameraControl(Arcball::create(2.0f));
     
     
     /* Create scene */
     auto scene = Scene::create();
     scene->setFog(Fog::create( 0x72645b / 2, 2.0, 15.0 ));
     scene->setViewport( 0.0, 0.0, renderer.getWidth(), renderer.getHeight() );
     scene->setShadowMapType( SHADOW_MAP::PCF_SOFT );
     
     /* Create camera */
     auto camera = PerspectiveCamera::create( 50.0, renderer.getAspectRatio(), 0.001, 100.0 );
     camera->translate(0.0, 1.5, 5.5);
     camera->lookAt( 0.0, 0.0, 0.0 );
     
     /* Create our objects */
     auto sphere = Mesh::create( SphereGeometry::create(30, 20, 0.66f ),
                                PhongMaterial::create(0x777777, 0x0, 0x0, 0x999999, 30, true) );
     
     sphere->setNormalMap( TextureUtils::loadAsNormalMap  ( path, "tutorial_normals07.gif" ) );
     sphere->translate(-2.0, 0.66f, 0.0);
     sphere->castShadow = true;
     sphere->receiveShadow = true;
     
     auto cube = Mesh::create( CubeGeometry::create(1.0, 10),
                              PhongMaterial::create(0x777777, 0x0, 0x0, 0x0, 30, false) );
     cube->setTexture( TextureUtils::loadAsTexture( path, "four_shapes_color.tga" ) );
     cube->translate(0.0, 0.5, 0.0);
     cube->castShadow = true;
     cube->receiveShadow = true;
     
     auto cylinder = Mesh::create( CylinderGeometry::create(0.5, 0.5, 1.0, 30, 5, true),
                                  PhongMaterial::create( 0xCCCCCC, 0x0, 0x0, 0x111111, 150.0, false ) );
     cylinder->getMaterial()->setSide( SIDE::DOUBLE_SIDE );
     cylinder->castShadow = true;
     cylinder->receiveShadow = true;
     cylinder->setTexture  ( TextureUtils::loadAsTexture   ( path, "rock_color.tga" ) );
     cylinder->setNormalMap( TextureUtils::loadAsNormalMap ( path, "rock_normal.tga" ) );
     cylinder->translate(+2.0f, 0.5f, -2.0f);
     
     scene->add( cylinder );
     scene->add( cube );
     scene->add( sphere );
     
     /* And the ground plane */
     auto plane = Mesh::create( PlaneGeometry::create(20.0f),
                               PhongMaterial::create(0x777777, 0x777777, 0x0, 0x999999, 30) );
     plane->name = "plane";
     plane->rotateX(-90.0f);
     plane->translate(0.0, 0.0, 0.0);
     plane->receiveShadow = true;
     scene->add( plane );
     
     /* Cubemap */
     auto env = Mesh::create( CubeGeometry::create(20.0f), MeshCubeMapMaterial::create() );
     env->setTexture( TextureUtils::loadAsEnvMap( path + "cube/pisa",
                                               "nx.png", "ny.png", "nz.png",
                                               "px.png", "py.png", "pz.png"));
     
     sphere->setEnvMap( downcast(env->getTexture(), EnvMap) );
     scene->add( env );
     
     
     /* Create a (rotating) directional light */
     auto dir_light = DirectionalLight::create(0x99CCFF, 1.35, glm::vec3( 3.0, 1.0, 3.0 ) );
     dir_light->castShadow       = true;
     dir_light->shadowBias       = -0.0005;
     dir_light->shadowMapSize    = glm::vec2(512);
     scene->add( dir_light );
     
     /* Create a spotlight, the shadow should be casted no the left hand side */
     auto spot_light = SpotLight::create(0x99CCFF, 1.0, 20.0, 50.0, 1.0 );
     spot_light->position = glm::vec3(3.0, 2.0, 3.0);
     spot_light->castShadow = true;
     scene->add( spot_light );
     
     /* Create an ambient light */
     scene->add( AmbientLight::create(0x777777));
     
     /* Create a post render callback for objects rotation */
     bool rotate_objects = false;
     float light_rotation_1 = 0.0;
     renderer.setPostRenderCallbackHandler( [&](){
         dir_light->position.x = ( 3.0 * cosf( light_rotation_1 ) );
         dir_light->position.z = ( 3.0 * sinf( light_rotation_1 ) );
         
         light_rotation_1 += 0.01;
         
         if( rotate_objects ) {
             cube->rotateX(-1.0f);
             cylinder->rotateX(1.0f);
         }
     });
     
     /* Override key callback handler */
     renderer.setKeyCallbackHandler([&](GLFWwindow *window, int key, int scancode, int action, int mod) {
         if( action == GLFW_PRESS ) {
             switch ( key) {
                 case GLFW_KEY_R: /* Toggle rotation */
                     rotate_objects = !rotate_objects;
                     break;
                     
                 default:
                     break;
             }
         }
     });
     
     renderer.setGamma( true, true );
     
     renderer.setClearColor( scene->getFog()->getColor() );
     renderer.render(scene, camera );
 }
    void Ex_008_FontStashIntegration::run() {
//        const string path = "/Users/saburookita/Personal Projects/Three.cpp Rev.2/examples/assets/";
        const string path = "../examples/assets/";
        
        ForwardRenderer renderer;
        renderer.init( "Ex 008: FontStash integration test", 1600 * 2 / 4, 900 * 2 / 4 );
        renderer.setCameraControl(Arcball::create(2.0f));
        
        
        /* First load the fonts */
        renderer.addFont("droid-regular",   path + "fonts/DroidSerif-Regular.ttf");
        renderer.addFont("droid-italic",    path + "fonts/DroidSerif-Italic.ttf");
        renderer.addFont("droid-bold",      path + "fonts/DroidSerif-Bold.ttf");
        renderer.addFont("droid-japanese",  path + "fonts/DroidSansJapanese.ttf");
        
        /*Then write on screen*/
        renderer.addText( "Test FontStash",     100, 100, "droid-regular", 0x0, 32.0f );
        renderer.addText( "writing in italic",  100, 130, "droid-italic", 0x00FF00, 24.0f );
        renderer.addText( "... or bold",        250, 130, "droid-bold", 0xFF0000, 24.0f );
        
        renderer.addText( "éßüä",               400, 90, "droid-regular", 0x0000FF, 24.0f );
        renderer.addText( "日本語もできます。",    400, 120, "droid-japanese", 0xFFFFFF, 24.0f );
        
        renderer.addText( "spacing = 1.0",   100, 200, "droid-italic", 0x00FF00, 20.0f, 1.0f );
        renderer.addText( "spacing = 5.0",   100, 225, "droid-italic", 0xFFFF00, 20.0f, 5.0f );
        renderer.addText( "spacing = 10.0",  100, 250, "droid-italic", 0x00FFFF, 20.0f, 10.0f );
        
        renderer.addText( "blur = 1.0",   400, 200, "droid-bold", 0x99CCFF, 30.0f, 0.0f, 1.0f );
        renderer.addText( "blur = 5.0",   400, 240, "droid-bold", 0xFFCC99, 30.0f, 0.0f, 5.0f );
        renderer.addText( "blur = 10.0",  400, 280, "droid-bold", 0xCCFF99, 30.0f, 0.0f, 10.0f );
        
        int cursor_pos_text = renderer.addText( "Cursor Position: ", 80, 400, "droid-regular", 0xFFFFFF, 20.0f );
        
        /* Create scene */
        auto scene = Scene::create();
        scene->setFog(Fog::create( 0x72645b, 2.0, 15.0 ));
        scene->setViewport( 0.0, 0.0, renderer.getWidth(), renderer.getHeight() );
        scene->setShadowMapType( SHADOW_MAP::PCF );
        
        /* Create camera */
        auto camera = PerspectiveCamera::create( 50.0, renderer.getAspectRatio(), 0.001, 100.0 );
        camera->translate(0.0, 1.5, 5.5);
        camera->lookAt( 0.0, 1.0, 0.0 );
        
        /* Load our ply models */
        float x_offset = -1.0;
        auto statue = Loader::loadPLY(path + "/ply models/", "happy_vrip_res3.ply",
                                      aiProcess_JoinIdenticalVertices |
                                      aiProcess_GenSmoothNormals | aiProcess_FlipWindingOrder );
        
        statue->setMaterial(PhongMaterial::create(0x777777, 0x0, 0x777777, 0x0, 0, true));
        statue->getGeometry()->setScale(10.f);
        statue->castShadow      = true;
        statue->receiveShadow   = true;
        
        auto bounding_box = statue->computeBoundingBox();
        glm::vec3 size    = bounding_box->size();
        glm::vec3 center  = bounding_box->center();
        statue->translate(x_offset, -(center.y - size.y * 0.5), 0.0);
        
        x_offset += 2.0f;
        scene->add( statue );
     
        
        /* A sphere, cube, and cylinder walk into a pub */
        auto sphere = Mesh::create( SphereGeometry::create(30, 20, 0.66f ),
                                   PhongMaterial::create( 0xCCCCCC, 0x0, 0x0, 0x222222, 130.0, true ) );
        
        sphere->setTexture      ( TextureUtils::loadAsTexture    ( path + "planets", "earth_atmos_2048.jpg") );
        sphere->setNormalMap    ( TextureUtils::loadAsNormalMap  ( path + "planets", "earth_normal_2048.jpg" ) );
        sphere->setSpecularMap  ( TextureUtils::loadAsSpecularMap( path + "planets", "earth_specular_2048.jpg" ) );
        sphere->receiveShadow = true;
        sphere->castShadow    = true;
        sphere->translate( x_offset, 0.66f, 0.0f );
        scene->add( sphere );
        
        
        auto plane = Mesh::create( PlaneGeometry::create(20.0f),
                                   PhongMaterial::create(0x777777, 0x777777, 0x0, 0x999999, 30) );
        plane->name = "plane";
        plane->rotateX(-90.0f);
        plane->receiveShadow = true;
        scene->add( plane );
        
        /* Cubemap */
        auto env = Mesh::create( CubeGeometry::create(50.0f), MeshCubeMapMaterial::create() );
        env->setTexture( TextureUtils::loadAsEnvMap( path + "cube/pisa",
                                                    "nx.png", "ny.png", "nz.png",
                                                    "px.png", "py.png", "pz.png"));
        statue->setEnvMap( env->getTexture() );
        scene->add( env );
        
        
        /* Create a (rotating) directional light */
        auto dir_light = DirectionalLight::create(0x99CCFF, 1.35, glm::vec3( 3.0, 1.0, 3.0 ) );
        dir_light->castShadow       = true;
        dir_light->shadowBias       = -0.001;
        dir_light->shadowCameraNear = -10.0;
        dir_light->shadowCameraFar  =  10.0;
        scene->add( dir_light );
        
        /* Create a spotlight, the shadow should be casted no the left hand side */
        auto spot_light = SpotLight::create(0x99CCFF, 1.0, 20.0, 50.0, 1.0 );
        spot_light->position = glm::vec3(3.0, 2.0, 3.0);
        spot_light->castShadow = true;
        scene->add( spot_light );
        
        /* Create an ambient light */
        scene->add( AmbientLight::create(0x777777));
        
        /* Create a post render callback for objects rotation */
        bool rotate_objects = false;
        float light_rotation_1 = 0.0;
        renderer.setPostRenderCallbackHandler( [&](){
            dir_light->position.x = ( 3.0 * cosf( light_rotation_1 ) );
            dir_light->position.z = ( 3.0 * sinf( light_rotation_1 ) );
            
            light_rotation_1 += 0.01;
            
            if( rotate_objects ) {
                statue->rotateY(1.0f);
                sphere->rotateY(-1.0f);
            }
        });
        
        renderer.setCursorCallbackHandler([&](GLFWwindow *, double x, double y){
            stringstream ss;
            ss.precision(4);
            ss << "Cursor Position: (" << x << ", " << y << ")";
            renderer.setText(cursor_pos_text, ss.str() );
        });
        
        /* Override key callback handler */
        renderer.setKeyCallbackHandler([&](GLFWwindow *window, int key, int scancode, int action, int mod) {
            if( action == GLFW_PRESS ) {
                switch ( key) {
                    case GLFW_KEY_R: /* Toggle rotation */
                        rotate_objects = !rotate_objects;
                        break;
                        
                    default:
                        break;
                }
            }
        });
        
        
        renderer.setGamma( true, true );
        
        renderer.setClearColor( scene->getFog()->getColor() );
        renderer.render(scene, camera );
    }