Example #1
0
void Sprite::setupTextureCoordAndSize(
    const Vec2& left_top,
    const Vec2& st_size
) {
    textureCoord(left_top, st_size);
    size(st_size);
    adjustPivotByCenter();
}
Example #2
0
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);
}
Example #3
0
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();
}
Example #4
0
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;
}
Example #5
0
	//---------------------------------------------------------------------
	void ManualObject::textureCoord(const Vector4& xyzw)
	{
		textureCoord(xyzw.x, xyzw.y, xyzw.z, xyzw.w);
	}
Example #6
0
	//-----------------------------------------------------------------------------
	void ManualObject::textureCoord(const Vector3& uvw)
	{
		textureCoord(uvw.x, uvw.y, uvw.z);
	}
Example #7
0
	//-----------------------------------------------------------------------------
	void ManualObject::textureCoord(const Vector2& uv)
	{
		textureCoord(uv.x, uv.y);
	}
Example #8
0
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 );
    }
    */

}