//Do not use this constructor yourself - instead, call getTexture() //to get/create an ImpostorTexture for an Entity. ImpostorTexture::ImpostorTexture(ImpostorPage *group, Entity *entity) : loader(0) { //Store scene manager and entity ImpostorTexture::sceneMgr = group->sceneMgr; ImpostorTexture::entity = entity; ImpostorTexture::group = group; //Add self to list of ImpostorTexture's entityKey = ImpostorBatch::generateEntityKey(entity); typedef std::pair<String, ImpostorTexture *> ListItem; selfList.insert(ListItem(entityKey, this)); //Calculate the entity's bounding box and it's diameter boundingBox = entity->getBoundingBox(); //Note - this radius calculation assumes the object is somewhat rounded (like trees/rocks/etc.) Real tmp; entityRadius = boundingBox.getMaximum().x - boundingBox.getCenter().x; tmp = boundingBox.getMaximum().y - boundingBox.getCenter().y; if (tmp > entityRadius) entityRadius = tmp; tmp = boundingBox.getMaximum().z - boundingBox.getCenter().z; if (tmp > entityRadius) entityRadius = tmp; entityDiameter = 2.0f * entityRadius; entityCenter = boundingBox.getCenter(); //Render impostor textures renderTextures(false); //Set up materials for (int o = 0; o < IMPOSTOR_YAW_ANGLES; ++o){ for (int i = 0; i < IMPOSTOR_PITCH_ANGLES; ++i){ material[i][o] = MaterialManager::getSingleton().create(getUniqueID("ImpostorMaterial"), "Impostors"); Material *m = material[i][o].getPointer(); Pass *p = m->getTechnique(0)->getPass(0); TextureUnitState *t = p->createTextureUnitState(texture->getName()); t->setTextureUScroll((float)o / IMPOSTOR_YAW_ANGLES); t->setTextureVScroll((float)i / IMPOSTOR_PITCH_ANGLES); p->setLightingEnabled(false); m->setReceiveShadows(false); if (group->getBlendMode() == ALPHA_REJECT_IMPOSTOR){ p->setAlphaRejectSettings(CMPF_GREATER_EQUAL, 128); //p->setAlphaRejectSettings(CMPF_GREATER_EQUAL, 64); } else if (group->getBlendMode() == ALPHA_BLEND_IMPOSTOR){ p->setSceneBlending(SBF_SOURCE_ALPHA, SBF_ONE_MINUS_SOURCE_ALPHA); p->setDepthWriteEnabled(false); } } } }
void ImpostorTexture::regenerate() { assert(!texture.isNull()); String texName(texture->getName()); texture.setNull(); if (TextureManager::getSingletonPtr()) TextureManager::getSingleton().remove(texName); renderTextures(true); updateMaterials(); }
RenderedTexture::RenderedTexture(Ogre::Entity* entity, Ogre::SceneManager* sceneMgr, Ogre::uint8 renderQueueGroup) : sceneMgr(sceneMgr), entity(entity), entityKey(generateEntityKey(entity)), renderQueueGroup(renderQueueGroup) { //Add self to list of RenderedTexture's typedef std::pair<std::string, RenderedTexture*> ListItem; selfList.insert(ListItem(entityKey, this)); // TODO: use bounding sphere //Note - this radius calculation assumes the object is somewhat rounded (like trees/rocks/etc.) Ogre::Real tmp; Ogre::AxisAlignedBox boundingBox = entity->getBoundingBox(); entityRadius = boundingBox.getMaximum().x - boundingBox.getCenter().x; tmp = boundingBox.getMaximum().y - boundingBox.getCenter().y; if (tmp > entityRadius) entityRadius = tmp; tmp = boundingBox.getMaximum().z - boundingBox.getCenter().z; if (tmp > entityRadius) entityRadius = tmp; entityCenter = boundingBox.getCenter(); //Render impostor textures renderTextures(); //Set up material material = Ogre::MaterialManager::getSingleton().create( getUniqueID("RenderedEntityMaterial"), "EntityRenderer"); Ogre::Material* m = material.getPointer(); Ogre::Pass* p = m->getTechnique(0)->getPass(0); p->createTextureUnitState(texture->getName()); p->setLightingEnabled(false); m->setReceiveShadows(false); if (blendMode == ALPHA_REJECT_IMPOSTOR){ p->setAlphaRejectSettings(Ogre::CMPF_GREATER_EQUAL, 128); //p->setAlphaRejectSettings(CMPF_GREATER_EQUAL, 64); } else if (blendMode == ALPHA_BLEND_IMPOSTOR){ p->setSceneBlending(Ogre::SBF_SOURCE_ALPHA, Ogre::SBF_ONE_MINUS_SOURCE_ALPHA); p->setDepthWriteEnabled(false); } }
//------------------------------------------------------------- // GLSupport::gl_init() initialize //------------------------------------------------------------- void GLSupport::gl_init() { static int initialized=0; if(!initialized){ const GLubyte *version=glGetString(GL_VERSION); const GLubyte *glsl_version=glGetString(GL_SHADING_LANGUAGE_VERSION); gl_version=10*(version[0]-'0'); gl_version+=version[2]-'0'; ARB_multitexture_supported=extensionSupported("GL_ARB_multitexture"); ARB_texture_env_combine_supported=extensionSupported("GL_ARB_texture_env_combine"); ARB_texture_cube_map_supported=extensionSupported("GL_ARB_texture_cube_map"); ARB_texture_env_dot3_supported=extensionSupported("GL_ARB_texture_env_dot3"); ARB_shading_language_100_supported=extensionSupported("GL_ARB_shading_language_100"); ARB_shader_objects_supported=extensionSupported("GL_ARB_shader_objects"); EXT_framebuffer_object_supported=extensionSupported("GL_EXT_framebuffer_object"); ARB_geometry_shader4_supported=extensionSupported("GL_ARB_geometry_shader4"); printf("OGL version : %s (%d)\n",version,gl_version); printf("GLSL version : %s \n",glsl_version); #ifdef SHOW_ALL_EXTENSIONS const GLubyte *exts=glGetString(GL_EXTENSIONS); printf("%s\n",exts); #endif initialized=1; } setContext(); // make white texture for ogl1.1 specular pass //if(gl_version==11){ // glGenTextures (1, &white_texture); // glBindTexture (GL_TEXTURE_2D, white_texture); //} glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); //glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST ); //glHint(GL_POINT_SMOOTH_HINT, GL_NICEST ); //glPolygonOffset(0.1,1); //glEnable(GL_POLYGON_OFFSET_FILL); int auxbufs=0; glGetIntegerv(GL_SAMPLE_BUFFERS_ARB,&auxbufs); //glEnable(GL_POLYGON_SMOOTH); //glEnable(GL_NORMALIZE); // unsigned char pixels[2*2*4]; //memset (pixels, 0xff, 2*2*4); //glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 2, 2, // 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); txchnls=1; if(multiTextures()){ #ifdef GL_MAX_TEXTURE_UNITS_ARB glGetIntegerv(GL_MAX_TEXTURE_UNITS_ARB,&txchnls); #else #ifdef GL_MAX_ACTIVE_TEXTURES_ARB glGetIntegerv(GL_MAX_ACTIVE_TEXTURES_ARB,&txchnls); #endif #endif printf("max multi-texture channels = %d\n",txchnls); } else printf(" multi-textures support disabled\n"); if(glsl()){ printf("GLSL supported\n"); if(geometry_shader()) printf("Geometry shader supported\n"); else printf("Geometry shader NOT supported\n"); if(renderTextures()) printf("Render to Texture supported\n"); else printf("Render to Texture NOT supported\n"); } else printf("GLSL NOT supported\n"); set_spectex(1); }
void display() { renderTextures(); /* glClearColor(0.0f, 0.0f, 0.2f, 0.5f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); gluOrtho2D(0, 100, 0, 100); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glPushAttrib(GL_VIEWPORT_BIT); glLoadIdentity(); //glTranslatef(0, 0, 1); //// Bottom left //glViewport(0, 0, sWidth/2, sHeight/2); //glBindTexture(GL_TEXTURE_2D, imgTexture); //renderQuad(); //// Bottom Right //glViewport(sWidth/2, 0, sWidth, sHeight/2); //glBindTexture(GL_TEXTURE_2D, outlineTexture); //renderQuad(); // Top left //glViewport(0, sHeight/2, sWidth/2, sHeight); glBindTexture(GL_TEXTURE_2D, depthTexture); glEnable(GL_TEXTURE_2D); renderQuad(); //// Top Right //glViewport(sWidth/2, sHeight/2, sWidth, sHeight); //glBindTexture(GL_TEXTURE_2D, normalTexture); //renderQuad(); glDisable(GL_TEXTURE_2D); glPopAttrib(); glPopMatrix(); glMatrixMode(GL_PROJECTION); glPopMatrix(); //*/ ///* glClearColor(0.0f, 0.0f, 0.2f, 0.5f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); // bind the first texture for rendering glBindTexture(GL_TEXTURE_2D, depthTexture); // regenerate the mipmap images as the texture has changed //glGenerateMipmapEXT(GL_TEXTURE_2D); glEnable(GL_TEXTURE_2D); glTranslatef(-1.0f, 1.0f, -4.5f); glRotatef(-xrot, 1.0f, 0.0f, 0.0f); glRotatef(-yrot, 0.0f, 1.0f, 0.0f); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); drawCube(); // draw the second cube glLoadIdentity(); glBindTexture(GL_TEXTURE_2D, normalTexture); glEnable(GL_TEXTURE_2D); glTranslatef(1.0f, 1.0f, -4.5f); glRotatef(-xrot, 1.0f, 0.0f, 0.0f); glRotatef(-yrot, 0.0f, 1.0f, 0.0f); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); drawCube(); // draw the third cube glLoadIdentity(); glBindTexture(GL_TEXTURE_2D, imgTexture); glEnable(GL_TEXTURE_2D); glTranslatef(1.0f, -1.0f, -4.5f); glRotatef(-xrot, 1.0f, 0.0f, 0.0f); glRotatef(-yrot, 0.0f, 1.0f, 0.0f); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); drawCube(); // draw the fourth cube glLoadIdentity(); glBindTexture(GL_TEXTURE_2D, imgTexture); glEnable(GL_TEXTURE_2D); glTranslatef(-1.0f, -1.0f, -4.5f); glRotatef(-xrot, 1.0f, 0.0f, 0.0f); glRotatef(-yrot, 0.0f, 1.0f, 0.0f); glColor4f(1.0f, 1.0f, 1.0f, 1.0f); sobelFilter->use(); sobelFilter->sendUniform("colorMap", 0); sobelFilter->sendUniform("width", texWidth); sobelFilter->sendUniform("height", texHeight); drawCube(); sobelFilter->disable(); glDisable(GL_TEXTURE_2D); //*/ xrot += xspeed; yrot += yspeed; //fps(); glutSwapBuffers(); }