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); }
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; }