void Sprite::setupTextureCoordAndSize( const Vec2& left_top, const Vec2& st_size ) { textureCoord(left_top, st_size); size(st_size); adjustPivotByCenter(); }
void Sprite::textureCoord( const Vec2& left_top, const Vec2& size ) { T3_NULL_ASSERT(texture_); float tex_width = static_cast<float>(texture_->width()); float tex_height = static_cast<float>(texture_->height()); float u0 = left_top.x_ / tex_width; float v0 = left_top.y_ / tex_height; float u1 = (left_top.x_ + size.x_) / tex_width; float v1 = (left_top.y_ + size.y_) / tex_height; textureCoord(u0, v0, u1, v1); }
void VoxelTerrain::mesh() { PolyVox::SurfaceMesh<PolyVox::PositionMaterialNormal> mesh; PolyVox::Region region(PolyVox::Vector3DInt32(0,0,0), PolyVox::Vector3DInt32(120, 60, 120)); //PolyVox::Vector3DInt32(120, 130, 120)); std::cout << "Begin extracting surface." << std::endl; //PolyVox::MarchingCubesSurfaceExtractor<PolyVox::LargeVolume<BYTE> > PolyVox::CubicSurfaceExtractorWithNormals<PolyVox::LargeVolume<BYTE> > surface_extractor(mVolumeData, region, &mesh); surface_extractor.execute(); std::cout << "Done extracting surface." << std::endl; begin("Terrain", Ogre::RenderOperation::OT_TRIANGLE_LIST); { const std::vector<PolyVox::PositionMaterialNormal>& vecVertices = mesh.getVertices(); const std::vector<uint32_t>& vecIndices = mesh.getIndices(); unsigned int uLodLevel = 0; int beginIndex = mesh.m_vecLodRecords[uLodLevel].beginIndex; int endIndex = mesh.m_vecLodRecords[uLodLevel].endIndex; for(int index = beginIndex; index < endIndex; ++index) { const PolyVox::PositionMaterialNormal& vertex = vecVertices[vecIndices[index]]; const PolyVox::Vector3DFloat& v3dVertexPos = vertex.getPosition(); const PolyVox::Vector3DFloat& v3dVertexNormal = vertex.getNormal(); const PolyVox::Vector3DFloat v3dFinalVertexPos = v3dVertexPos + static_cast<PolyVox::Vector3DFloat>(mesh.m_Region.getLowerCorner()); position(v3dFinalVertexPos.getX(), v3dFinalVertexPos.getY(), v3dFinalVertexPos.getZ()); normal(v3dVertexNormal.getX(), v3dVertexNormal.getY(), v3dVertexNormal.getZ()); //colour(1, 0, 0, 0.5); textureCoord(v3dFinalVertexPos.getX()/4.0f, v3dFinalVertexPos.getY()/4.0f, v3dFinalVertexPos.getZ()/4.0f); } } end(); }
TriangelMesh * ManualMesh::getTriangelMesh() { TriangelMesh * mesh = new TriangelMesh(material); mesh->setVertexData(vertex.begin(),vertex.end(),vertex.size()); mesh->setStripsData(strip.begin(),strip.end(),strip.size()); if(uvs.size() != 0 && uvs.size() != vertex.size()) textureCoord(Fvec2(0,0)); if(uvs.size( ) != 0) mesh->setUvData(uvs.begin(),uvs.end(),uvs.size()); if(colors.size() != 0 && colors.size() != vertex.size()) color(Fvec4(0,0,0,0)); if(colors.size() != 0) mesh->setColorData(colors.begin(),colors.end(),colors.size()); if(normals.size() == 0 && normals.size() != vertex.size()) normal(Fvec4(0,1,0,0)); if(normals.size() != 0) mesh->setNormalData(normals.begin(),normals.end(),normals.size()); return mesh; }
//--------------------------------------------------------------------- void ManualObject::textureCoord(const Vector4& xyzw) { textureCoord(xyzw.x, xyzw.y, xyzw.z, xyzw.w); }
//----------------------------------------------------------------------------- void ManualObject::textureCoord(const Vector3& uvw) { textureCoord(uvw.x, uvw.y, uvw.z); }
//----------------------------------------------------------------------------- void ManualObject::textureCoord(const Vector2& uv) { textureCoord(uv.x, uv.y); }
void Layer::surfaceLineDraw( Ogre::SceneManager* sm, Ogre::SceneNode* sn, const surface2d_t& sl ) const { assert( (sl.size() > 1) && "Линия поверхности не получена, образ не может быть создан." ); // Рисуем образ линии поверхности auto slImage = sm->createManualObject(); int i = 0; // Подготавливаем и накладываем текстуру // @see http://www.gamedev.ru/code/articles/?id=4191\ // @see Тест-блоки ниже. // Достаточно указать текстурные координаты для каждой вершины. Наложение // размазано по построению вершин. См. ниже. // @todo Текстура должна заполнять поверхность. Получается - только границы поверхности. // Размер объекта, по крайним координатам const box2d_t slBox = calcBox( sl ); const size2d_t slSize = calcSize( slBox ); // Размер текстуры (материала) const std::string materialName = "landscape25/test"; const size2d_t texture( 1024.0f, 1024.0f ); // Накладываем 1 текстуру на 1 объект: вычисляем масштаб const scale2d_t ts = ONE2D / slSize; // Текстурные координаты для вершин coord2d_t uv( 0.0f, 0.0f ); // Рисуем поверхность slImage->begin( "BaseWhiteNoLighting", Ogre::RenderOperation::OT_LINE_STRIP ); //slImage->begin( materialName, Ogre::RenderOperation::OT_TRIANGLE_FAN ); //slImage->begin( materialName, Ogre::RenderOperation::OT_TRIANGLE_STRIP ); const int firstIndexSL = i; /* @test slImage->position( 0.0f, 0.0f, 0.0f ); slImage->index( i ); ++i; slImage->position( 100.0f, 0.0f, 0.0f ); slImage->index( i ); ++i; slImage->position( 100.0f, 0.0f, -200.0f ); slImage->index( i ); ++i; slImage->position( 0.0f, 0.0f, -200.0f ); slImage->index( i ); ++i; slImage->index( 0 ); */ /* // Создаём текстуру для слоя // @source http://www.ogre3d.ru/forum/viewtopic.php?f=8&t=4345 Ogre::ColourValue diffuse; diffuse.a = 0.5f; Ogre::MaterialPtr materialPtr = Ogre::MaterialManager::getSingleton().create( "Red", "General" ); Ogre::TextureUnitState* Texture = materialPtr->getTechnique(0)->getPass(0)->createTextureUnitState(); // Задаём параметры отображения текстуры, цвет Texture->setColourOperationEx( Ogre::LBX_SOURCE1, Ogre::LBS_MANUAL, Ogre::LBS_CURRENT, Ogre::ColourValue::Red ); // Режим прозрачности materialPtr->getTechnique(0)->getPass(0)->setSceneBlending( Ogre::SBT_TRANSPARENT_ALPHA ); materialPtr->getTechnique(0)->getPass(0)->setDepthWriteEnabled( false ); materialPtr->getTechnique(0)->getPass(0)->setDiffuse( diffuse ); */ // Получаем координаты крайних точек //const coord2d_t first = sl.front(); //const coord2d_t last = sl.back(); //const size2d_t size = calcSize( std::make_pair( last, first ) ); // Рисуем полученную выше линию поверхности for (auto itr = sl.cbegin(); itr != sl.cend(); ++itr) { const coord2d_t coord = *itr; slImage->position( coord.get<0>(), 0.0f, coord.get<1>() ); slImage->index( i ); ++i; // Текстура uv = coord * ts; slImage->textureCoord( uv.get<0>(), uv.get<1>() ); } // Замыкаем образ внизу по крайним точкам 'sl' const coord2d_t lastCoord = sl.back(); const coord2d_t firstCoord = sl.front(); const int bottomSpace = 500; //const coord2d_t bottomCoord = std::min( lastCoord.get<1>(), firstCoord.get<1>() ); //const float bottomCoordZ = min<1>( sl ) - bottomSpace; // Стабильная нижняя координата смотрится красивее скачущего слоя const float bottomCoordZ = -bottomSpace; slImage->position( lastCoord.get<0>(), 0.0f, bottomCoordZ ); slImage->index( i ); ++i; uv = lastCoord * ts; slImage->textureCoord( uv.get<0>(), uv.get<1>() ); slImage->position( firstCoord.get<0>(), 0.0f, bottomCoordZ ); slImage->index( i ); ++i; uv = firstCoord * ts; slImage->textureCoord( uv.get<0>(), uv.get<1>() ); slImage->index( firstIndexSL ); // Завершаем построение slImage->end(); slImage->setCastShadows( false ); const std::string meshName = sn->getName() + "-layer.mesh"; auto mesh = slImage->convertToMesh( meshName ); // Помещаем объект на сцену auto e = sm->createEntity( meshName ); //e->setMaterialName( "landscape25/test" ); sn->attachObject( e ); // <@test> // @source http://www.packtpub.com/article/materials-ogre-3d /*{ auto manual = sm->createManualObject( "Quad" ); manual->begin( "BaseWhiteNoLighting", Ogre::RenderOperation::OT_TRIANGLE_LIST ); manual->position( 50.0, 0.0, 0.0 ); manual->textureCoord( 0, 2 ); manual->position( -50.0, 0.0, 100.0 ); manual->textureCoord( 2, 0 ); manual->position( -50.0, 0.0, 0.0 ); manual->textureCoord( 2, 2 ); manual->position( 50.0, 0.0, 100.0 ); manual->textureCoord( 0, 0 ); manual->index( 0 ); manual->index( 1 ); manual->index( 2 ); manual->index( 0 ); manual->index( 3 ); manual->index( 1 ); manual->end(); manual->convertToMesh( "Quad" ); auto e = sm->createEntity( "Quad" ); e->setMaterialName( "landscape25/test" ); //auto node = sn->createChildSceneNode(); auto node = sm->getRootSceneNode()->createChildSceneNode( "Node1" ); node->showBoundingBox( true ); //const Ogre::Quaternion rx( Ogre::Degree( -90 ), Ogre::Vector3::UNIT_X ); //node->rotate( rx ); node->attachObject( e ); }*/ // </@test> // <@test> // @example http://pastebin.com/MZVQDENZ /*{ const std::string name = "Test2"; try { sm->destroyManualObject( name ); sm->destroyEntity( name ); sm->destroySceneNode( name ); } catch ( ... ) { } auto m = sm->createManualObject( name ); m->begin( "BaseWhiteNoLighting", Ogre::RenderOperation::OT_TRIANGLE_STRIP ); m->position( 0.0f, 0.0f, 0.0f ); m->textureCoord( 0, 0 ); m->position( 0.0f, 0.0f, -200.0f ); m->textureCoord( 0, 1 ); m->position( 100.0f, 0.0f, 0.0f ); m->textureCoord( 1, 0 ); m->position( 100.0f, 0.0f, -200.0f ); m->textureCoord( 1, 1 ); m->index( 0 ); m->index( 1 ); m->index( 2 ); m->index( 1 ); m->index( 3 ); m->index( 2 ); m->end(); auto mesh = m->convertToMesh( name ); auto e = sm->createEntity( name ); e->setMaterialName( "landscape25/test" ); auto node = sm->getRootSceneNode()->createChildSceneNode( name ); node->showBoundingBox( true ); node->attachObject( e ); }*/ // <@test> // <@test> // 1 треугольник /*{ const std::string name = "Test3"; try { sm->destroyManualObject( name ); sm->destroyEntity( name ); sm->destroySceneNode( name ); } catch ( ... ) { } // @source http://www.gamedev.ru/code/articles/?id=4191 // Вершины треугольника в плоскости XZ const coord2d_t a( 0.0f, 0.0f ); const coord2d_t b( 0.0f, 300.0f ); const coord2d_t c( 100.0f, 200.0f ); // Размер объекта, по крайним координатам const size2d_t object( 100.0f, 300.0f ); // Размер текстуры const size2d_t texture( 1024.0f, 1024.0f ); // Накладываем текстуру на объект целиком: вычисляем масштаб //const scale2d_t s = texture / object; // Размер текселя //const size2d_t texel( 1.0f, 1.0f ); // Рисуем объект, вычисляя текстурные координаты грани coord2d_t uv( 0.0f, 0.0f ); auto m = sm->createManualObject( name ); m->begin( "BaseWhiteNoLighting", Ogre::RenderOperation::OT_TRIANGLE_LIST ); m->position( a.get<0>(), 0.0f, a.get<1>() ); uv = a / object; m->textureCoord( uv.get<0>(), uv.get<1>() ); m->position( b.get<0>(), 0.0f, b.get<1>() ); uv = b / object; m->textureCoord( uv.get<0>(), uv.get<1>() ); m->position( c.get<0>(), 0.0f, c.get<1>() ); uv = c / object; m->textureCoord( uv.get<0>(), uv.get<1>() ); m->triangle( 1, 0, 2 ); m->end(); auto mesh = m->convertToMesh( name ); auto e = sm->createEntity( name ); e->setMaterialName( "landscape25/test" ); auto node = sm->getRootSceneNode()->createChildSceneNode( name ); node->showBoundingBox( true ); node->attachObject( e ); }*/ // <@test> // <@test> // Фигура из 3 треугольников /*{ const std::string name = "Test3-3"; try { sm->destroyManualObject( name ); sm->destroyEntity( name ); sm->destroySceneNode( name ); } catch ( ... ) { } // @source http://www.gamedev.ru/code/articles/?id=4191 // Вершины треугольника в плоскости XZ const coord2d_t a( 0.0f, 0.0f ); const coord2d_t b( 0.0f, 300.0f ); const coord2d_t c( 100.0f, 200.0f ); const coord2d_t d( 400.0f, 200.0f ); const coord2d_t e( 400.0f, 0.0f ); // Размер объекта, по крайним координатам const size2d_t object( 400.0f, 300.0f ); // Размер текстуры const size2d_t texture( 1024.0f, 1024.0f ); // Накладываем 1 текстуру на 1 объект: вычисляем масштаб const scale2d_t s = ONE2D / object; // Размер текселя //const size2d_t texel( 1.0f, 1.0f ); // Рисуем объект, вычисляя текстурные координаты грани coord2d_t uv( 0.0f, 0.0f ); auto m = sm->createManualObject( name ); m->begin( "BaseWhiteNoLighting", Ogre::RenderOperation::OT_TRIANGLE_FAN ); int i = 0; // 1-й треугольник m->position( a.get<0>(), 0.0f, a.get<1>() ); m->index( i ); ++i; uv = a * s; m->textureCoord( uv.get<0>(), uv.get<1>() ); m->position( b.get<0>(), 0.0f, b.get<1>() ); m->index( i ); ++i; uv = b * s; m->textureCoord( uv.get<0>(), uv.get<1>() ); m->position( c.get<0>(), 0.0f, c.get<1>() ); m->index( i ); ++i; uv = c * s; m->textureCoord( uv.get<0>(), uv.get<1>() ); m->index( 0 ); m->index( 2 ); m->index( 1 ); // 2-й треугольник m->position( d.get<0>(), 0.0f, d.get<1>() ); m->index( i ); ++i; uv = d * s; m->textureCoord( uv.get<0>(), uv.get<1>() ); m->index( 0 ); m->index( 3 ); m->index( 2 ); // 3-й треугольник m->position( e.get<0>(), 0.0f, e.get<1>() ); m->index( i ); ++i; uv = e * s; m->textureCoord( uv.get<0>(), uv.get<1>() ); m->index( 0 ); m->index( 4 ); m->index( 3 ); m->end(); auto mesh = m->convertToMesh( name ); auto entity = sm->createEntity( name ); entity->setMaterialName( "landscape25/test" ); auto node = sm->getRootSceneNode()->createChildSceneNode( name ); node->showBoundingBox( true ); node->attachObject( entity ); }*/ // <@test> /* - ? unsigned short src, dest; if (!mesh->suggestTangentVectorBuildParams( Ogre::VES_TANGENT, src, dest) ) { mesh->buildTangentVectors( Ogre::VES_TANGENT, src, dest ); } */ }