2

我们正在尝试将 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);
}
4

0 回答 0