Проблемы с текстурой в librocket, ogre & ios

Мы пытаемся использовать librocket http://librocket.com/ вместе с Ogre http://www.ogre3d.org/. Они оба являются частью gamekit http://code.google.com/p/gamekit/ который я использую для этого проекта.

Все это прекрасно работает вместе, пока я не загружаю изображение с помощью librocket. Как только я это сделаю, окно просмотра на iPad больше не будет полноэкранным, а будет маленьким в нижнем углу. Как это: http://uploads.undef.ch/machine/ipad.png

Я не могу установить связь между загрузкой / рендерингом текстуры и изменением размера области просмотра. И я не могу найти ничего плохого в RenderInterface. http://uploads.undef.ch/machine/RenderInterfaceOgre3D.cpp

Есть ли какая-либо команда OpenGLES, которая может повлиять на размер активного окна просмотра?

Это соответствующий код, который загружает изображение и отображает его:

// Called by Rocket when a texture is required by the library.
bool RenderInterfaceOgre3D::LoadTexture(Rocket::Core::TextureHandle& texture_handle, Rocket::Core::Vector2i& texture_dimensions, const Rocket::Core::String& source)
{
    Ogre::TextureManager* texture_manager = Ogre::TextureManager::getSingletonPtr();
    Ogre::TexturePtr ogre_texture = texture_manager->getByName(Ogre::String(source.CString()));
    if (ogre_texture.isNull())
    {
        ogre_texture = texture_manager->load(Ogre::String(source.CString()),
                            DEFAULT_ROCKET_RESOURCE_GROUP,
                            Ogre::TEX_TYPE_2D,
                            0);
    }

    if (ogre_texture.isNull())
        return false;

    texture_dimensions.x = ogre_texture->getWidth();
    texture_dimensions.y = ogre_texture->getHeight();

    texture_handle = reinterpret_cast<Rocket::Core::TextureHandle>(new RocketOgre3DTexture(ogre_texture));
    return true;
}

// Called by Rocket when it wants to render geometry that it does not wish to optimise.
void RenderInterfaceOgre3D::RenderGeometry(Rocket::Core::Vertex* vertices, int num_vertices, int* indices, int num_indices, Rocket::Core::TextureHandle texture, const Rocket::Core::Vector2f& translation)
{
    // We've chosen to not support non-compiled geometry in the Ogre3D renderer.
    // But if you want, you can uncomment this code, so borders will be shown.
    /*
    Rocket::Core::CompiledGeometryHandle gh = CompileGeometry(vertices, num_vertices, indices, num_indices, texture);
    RenderCompiledGeometry(gh, translation);
    ReleaseCompiledGeometry(gh);
    */
}

// Called by Rocket when it wants to compile geometry it believes will be static for the forseeable future.
Rocket::Core::CompiledGeometryHandle RenderInterfaceOgre3D::CompileGeometry(Rocket::Core::Vertex* vertices, int num_vertices, int* indices, int num_indices, Rocket::Core::TextureHandle texture)
{
    RocketOgre3DCompiledGeometry* geometry = new RocketOgre3DCompiledGeometry();
    geometry->texture = texture == NULL ? NULL : (RocketOgre3DTexture*) texture;

    geometry->render_operation.vertexData = new Ogre::VertexData();
    geometry->render_operation.vertexData->vertexStart = 0;
    geometry->render_operation.vertexData->vertexCount = num_vertices;

    geometry->render_operation.indexData = new Ogre::IndexData();
    geometry->render_operation.indexData->indexStart = 0;
    geometry->render_operation.indexData->indexCount = num_indices;

    geometry->render_operation.operationType = Ogre::RenderOperation::OT_TRIANGLE_LIST;


    // Set up the vertex declaration.
    Ogre::VertexDeclaration* vertex_declaration = geometry->render_operation.vertexData->vertexDeclaration;
    size_t element_offset = 0;
    vertex_declaration->addElement(0, element_offset, Ogre::VET_FLOAT3, Ogre::VES_POSITION);
    element_offset += Ogre::VertexElement::getTypeSize(Ogre::VET_FLOAT3);
    vertex_declaration->addElement(0, element_offset, Ogre::VET_COLOUR, Ogre::VES_DIFFUSE);
    element_offset += Ogre::VertexElement::getTypeSize(Ogre::VET_COLOUR);
    vertex_declaration->addElement(0, element_offset, Ogre::VET_FLOAT2, Ogre::VES_TEXTURE_COORDINATES);

#if GK_PLATFORM == GK_PLATFORM_APPLE_IOS
    // Create the vertex buffer.
    Ogre::HardwareVertexBufferSharedPtr vertex_buffer = Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(vertex_declaration->getVertexSize(0), num_vertices, Ogre::HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY_DISCARDABLE,true);
    geometry->render_operation.vertexData->vertexBufferBinding->setBinding(0, vertex_buffer);

    // Fill the vertex buffer.
    RocketOgre3DVertex* ogre_vertices = (RocketOgre3DVertex*) vertex_buffer->lock(0, vertex_buffer->getSizeInBytes(), Ogre::HardwareBuffer::HBL_DISCARD);
#else
    Ogre::HardwareVertexBufferSharedPtr vertex_buffer = Ogre::HardwareBufferManager::getSingleton().createVertexBuffer(vertex_declaration->getVertexSize(0), num_vertices, Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY);
    geometry->render_operation.vertexData->vertexBufferBinding->setBinding(0, vertex_buffer);

    // Fill the vertex buffer.
    RocketOgre3DVertex* ogre_vertices = (RocketOgre3DVertex*) vertex_buffer->lock(0, vertex_buffer->getSizeInBytes(), Ogre::HardwareBuffer::HBL_NORMAL);
#endif

    for (int i = 0; i < num_vertices; ++i)
    {
        ogre_vertices[i].x = vertices[i].position.x;
        ogre_vertices[i].y = vertices[i].position.y;
        ogre_vertices[i].z = 0;

        Ogre::ColourValue diffuse(vertices[i].colour.red / 255.0f, vertices[i].colour.green / 255.0f, vertices[i].colour.blue / 255.0f, vertices[i].colour.alpha / 255.0f);
        render_system->convertColourValue(diffuse, &ogre_vertices[i].diffuse);

        ogre_vertices[i].u = vertices[i].tex_coord[0];
        ogre_vertices[i].v = vertices[i].tex_coord[1];
    }
    vertex_buffer->unlock();

#if GK_PLATFORM == GK_PLATFORM_APPLE_IOS
    // Create the index buffer.
    Ogre::HardwareIndexBufferSharedPtr index_buffer = Ogre::HardwareBufferManager::getSingleton().createIndexBuffer(Ogre::HardwareIndexBuffer::IT_16BIT, num_indices, Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY);
    geometry->render_operation.indexData->indexBuffer = index_buffer;
    geometry->render_operation.useIndexes = true;
#else
    Ogre::HardwareIndexBufferSharedPtr index_buffer = Ogre::HardwareBufferManager::getSingleton().createIndexBuffer(Ogre::HardwareIndexBuffer::IT_32BIT, num_indices, Ogre::HardwareBuffer::HBU_STATIC_WRITE_ONLY);    
    geometry->render_operation.indexData->indexBuffer = index_buffer;
    geometry->render_operation.useIndexes = true;
#endif


    // Fill the index buffer.
    unsigned short * ogre_indices = (unsigned short*)index_buffer->lock(0, index_buffer->getSizeInBytes(), Ogre::HardwareBuffer::HBL_NORMAL);
#if GK_PLATFORM == GK_PLATFORM_APPLE_IOS    
    //unsigned short short_indices[num_indices];
    for(int i=0;i<num_indices;i++)
        ogre_indices[i] = indices[i];
    //memcpy(ogre_indices, short_indices, sizeof(unsigned short) * num_indices);
#else
    memcpy(ogre_indices, indices, sizeof(unsigned int) * num_indices);
#endif
    index_buffer->unlock();

    return reinterpret_cast<Rocket::Core::CompiledGeometryHandle>(geometry);
}

// Called by Rocket when it wants to render application-compiled geometry.
void RenderInterfaceOgre3D::RenderCompiledGeometry(Rocket::Core::CompiledGeometryHandle geometry, const Rocket::Core::Vector2f& translation)
{
    Ogre::Matrix4 transform;
    transform.makeTrans(translation.x, translation.y, 0);
    render_system->_setWorldMatrix(transform);

    render_system = Ogre::Root::getSingleton().getRenderSystem();
    RocketOgre3DCompiledGeometry* ogre3d_geometry = (RocketOgre3DCompiledGeometry*) geometry;

    if (ogre3d_geometry->texture != NULL)
    {
        render_system->_setTexture(0, true, ogre3d_geometry->texture->texture);

        // Ogre can change the blending modes when textures are disabled - so in case the last render had no texture,
        // we need to re-specify them.
        render_system->_setTextureBlendMode(0, colour_blend_mode);
        render_system->_setTextureBlendMode(0, alpha_blend_mode);
    }
    else
        render_system->_disableTextureUnit(0);

    render_system->_render(ogre3d_geometry->render_operation);
}

0 ответов

Другие вопросы по тегам