Exemplo n.º 1
0
	void BSPLoader::renderFace( int index )
	{
		sBSPFace face = _faces[index];

		ITexture* tex = NULL; 
		sBSPTexture st = _textures[face.textureID];
		tex = _getTexture(st.strName);
		if (tex != NULL)
		{
			_renderSystem->setTexture(0, tex);
		}

		switch(face.type)
		{
		case sBSPFace::eType_Polygon:
		case sBSPFace::eType_Mesh:
			{
				POSITION_COLOR_TEXTURE* v = new POSITION_COLOR_TEXTURE[face.numMeshVerts];

				for (int i = 0; i < face.numMeshVerts; ++i)
				{
					int indexI = face.meshVertIndex + i;

					int indexV = _meshVertices[indexI];

					indexV += face.vertexIndex;

					v[i]._pos.x = _vertices[indexV].vPosition[0] * 0.00001;
					v[i]._pos.z = _vertices[indexV].vPosition[1] * 0.00001;
					v[i]._pos.y = _vertices[indexV].vPosition[2] * 0.00001;

					v[i]._color = *(DWORD*)&_vertices[indexV].color;

					v[i]._tex.x = _vertices[indexV].vTextureCoord[0];
					v[i]._tex.y = _vertices[indexV].vTextureCoord[1];
				}

				_renderSystem->drawPrimitiveUP(D3DPT_TRIANGLELIST, 
					face.numMeshVerts / 3, v, sizeof(POSITION_COLOR_TEXTURE));

				delete[] v;
			}
			break;
		case sBSPFace::eType_Billboard:
			break;
		case sBSPFace::eType_Patch:
			break;
		default:
			break;
		}

		_renderSystem->setRenderState(D3DRS_ALPHABLENDENABLE, true);
		_renderSystem->setRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
		_renderSystem->setRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
		_renderLight(index);
		_renderSystem->setRenderState(D3DRS_ALPHABLENDENABLE, false);
	}
Exemplo n.º 2
0
	bool TerrainQuery::getTerrainData(osg::Vec3d& location, osg::Vec4 &texture_color, std::string &coverage_name, CoverageColor &coverage_color, osg::Vec3d &inter)
	{
		osg::Vec3d start_location(location.x(),location.y(), -10000);
		osg::ref_ptr<osgUtil::LineSegmentIntersector> intersector =	new osgUtil::LineSegmentIntersector(start_location,start_location + osg::Vec3(0.0f,0.0f,20000));
		m_IntersectionVisitor.setIntersector(intersector.get());
		m_Terrain->accept(m_IntersectionVisitor);
		if (intersector->containsIntersections())
		{
			osgUtil::LineSegmentIntersector::Intersections& intersections = intersector->getIntersections();
			for(osgUtil::LineSegmentIntersector::Intersections::iterator itr = intersections.begin();
				itr != intersections.end();
				++itr)
			{
				const osgUtil::LineSegmentIntersector::Intersection& intersection = *itr;
				osg::Vec3 tc;
				osg::Texture* texture = _getTexture(intersection,tc);

				if(texture && texture->getImage(0))
				{
					std::string tex_filename = osgDB::getSimpleFileName(texture->getImage(0)->getFileName());
				    //check if dds, if so we will try to load alternative image file because we have no utils to decompress dds
					if(osgDB::getFileExtension(tex_filename) == "dds")
					{
						tex_filename = osgDB::getNameLessExtension(tex_filename) + m_ColorTextureSuffix;

						//std::cout << tex_filename <<"\n";
						osg::Image* image = _loadImage(tex_filename);
						if(m_FlipColorCoordinates)
							tc.set(tc.x(),1.0 - tc.y(),tc.z());
						texture_color = image->getColor(tc);
					}
					else
						texture_color = texture->getImage(0)->getColor(tc);

					if (m_CoverageTexture != "" || m_CoverageTextureSuffix != "")
					{
						//get material texture
						std::string mat_image_filename;
						if (m_CoverageTexture != "")
							mat_image_filename = m_CoverageTexture;
						else
							mat_image_filename = osgDB::getNameLessExtension(osgDB::getSimpleFileName(tex_filename)) + m_CoverageTextureSuffix;

						osg::Image* image = _loadImage(mat_image_filename);

						if (m_FlipCoverageCoordinates)
							tc.set(tc.x(), 1.0 - tc.y(), tc.z());

						//tc2 = osg::clampTo(tc2, osg::Vec3(0,0,0),osg::Vec3(1,1,1));
						tc.set(osg::clampTo((double)tc.x(), (double) 0.0, (double) 1.0),
							osg::clampTo((double)tc.y(), (double) 0.0, (double)1.0), (double)tc.z());
						coverage_color = image->getColor(tc);
						coverage_name = m_CoverageData.getCoverageMaterialName(coverage_color);
					}
					else
					{
						coverage_name = "WOODS";
					}
				}
				inter = intersection.getWorldIntersectPoint();
				return true;
			}
		}
		return false;
	}