Also, mein Code dafür sieht etwa so aus:
GraphicsEngine.cpp, wird aufgerufen, bevor 2D gerendert wird (Ist vllt falsch, hab da kP davon, hab das per experimentieren so geschrieben):
Code:
// Reset transformation for 2D drawing
core::matrix4 worldmatrix;
worldmatrix.setTranslation(core::vector3df(-0.5, -0.5, 0));
driver->setTransform(video::ETS_WORLD, worldmatrix);
core::matrix4 viewmatrix;
viewmatrix.buildProjectionMatrixOrthoLH(1, -1, 1, -1);
driver->setTransform(video::ETS_PROJECTION, viewmatrix);
driver->setTransform(video::ETS_VIEW, core::matrix4());
OverlayManager::get()->render();
Overlay.cpp, rendert die 2D-Grafik als zwei Dreiecke, mit Rotation:
Code:
Vector2D position = getAbsolutePosition();
Vector2D size = getAbsoluteSize();
size /= 2;
Vector2D center = position + size;
float rotation = getAbsoluteRotation();
core::dimension2d<s32> windowsize = GraphicsEngine::get()->getDriver()->getCurrentRenderTargetSize();
float aspectratio = (float)windowsize.Width / windowsize.Height;
// Create data to render
video::S3DVertex vertices[4];
Vector2D offset = size;
offset.y /= aspectratio;
offset.rotate(rotation);
offset.y *= aspectratio;
core::vector3df pos1 = core::vector3df(center.x + offset.x, center.y + offset.y, 0);
core::vector3df pos3 = core::vector3df(center.x - offset.x, center.y - offset.y, 0);
offset = size;
offset.x = -offset.x;
offset.y /= aspectratio;
offset.rotate(rotation);
offset.y *= aspectratio;
core::vector3df pos2 = core::vector3df(center.x + offset.x, center.y + offset.y, 0);
core::vector3df pos4 = core::vector3df(center.x - offset.x, center.y - offset.y, 0);
vertices[0] = video::S3DVertex(pos1, core::vector3df(-1,-1,-1), video::SColor(255, 255, 255, 255), core::vector2df(1, 1));
vertices[1] = video::S3DVertex(pos2, core::vector3df(1,-1,-1), video::SColor(255, 255, 255, 255), core::vector2df(0, 1));
vertices[2] = video::S3DVertex(pos3, core::vector3df(1, 1,-1), video::SColor(255, 255, 255, 255), core::vector2df(0, 0));
vertices[3] = video::S3DVertex(pos4, core::vector3df(-1, 1,-1), video::SColor(255, 255, 255, 255), core::vector2df(1, 0));
u16 indices[6] = {0,1,2, 0,2,3};
// Render colored rectangle
video::SMaterial material;
material.Lighting = false;
material.Wireframe = false;
material.ZWriteEnable = false;
material.setTexture(0, GraphicsEngine::get()->getDriver()->getTexture(texture.c_str()));
material.MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
GraphicsEngine::get()->getDriver()->setMaterial(material);
GraphicsEngine::get()->getDriver()->drawIndexedTriangleList(&vertices[0], 4, &indices[0], 2);
Das ist natürlich noch kein bisschen optimiert, alle Berechnungen sollten nur nach einem setPosition() ausgeführt werden, vor allem das Laden der Textur in der Funktion selbst ist eigentlich absolut grausam.
In deinem Fall müsstest du dann halt die UV-Koordinaten entsprechend anpassen (der vector2d bei der Vertex-Definition).
EDIT: Die falsche Darstellung lag an den Texturfiltern, die Irrlicht für 2D nicht unterstützt, siehe anderer Thread.