Exemplo n.º 1
0
//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);  
		}
	}
	}
}
Exemplo n.º 2
0
void ImpostorTexture::regenerate()
{
	assert(!texture.isNull());
	String texName(texture->getName());
	texture.setNull();
	if (TextureManager::getSingletonPtr())
		TextureManager::getSingleton().remove(texName);

	renderTextures(true);
	updateMaterials();
}
Exemplo n.º 3
0
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);  
    }
}
Exemplo n.º 4
0
//-------------------------------------------------------------
// 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);
}
Exemplo n.º 5
0
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();
}