1
// Copyright (C) 2002-2011 Nikolaus Gebhardt
2
// This file is part of the "Irrlicht Engine".
3
// For conditions of distribution and use, see copyright notice in irrlicht.h
5
#include "CGUIMeshViewer.h"
6
#ifdef _IRR_COMPILE_WITH_GUI_
8
#include "IGUIEnvironment.h"
9
#include "IVideoDriver.h"
10
#include "IAnimatedMesh.h"
23
CGUIMeshViewer::CGUIMeshViewer(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
24
: IGUIMeshViewer(environment, parent, id, rectangle), Mesh(0)
27
setDebugName("CGUIMeshViewer");
33
CGUIMeshViewer::~CGUIMeshViewer()
40
//! sets the mesh to be shown
41
void CGUIMeshViewer::setMesh(scene::IAnimatedMesh* mesh)
50
/* This might be used for proper transformation etc.
51
core::vector3df center(0.0f,0.0f,0.0f);
52
core::aabbox3d<f32> box;
54
box = Mesh->getMesh(0)->getBoundingBox();
55
center = (box.MaxEdge + box.MinEdge) / 2;
60
//! Gets the displayed mesh
61
scene::IAnimatedMesh* CGUIMeshViewer::getMesh() const
68
void CGUIMeshViewer::setMaterial(const video::SMaterial& material)
75
const video::SMaterial& CGUIMeshViewer::getMaterial() const
81
//! called if an event happened.
82
bool CGUIMeshViewer::OnEvent(const SEvent& event)
84
return IGUIElement::OnEvent(event);
88
//! draws the element and its children
89
void CGUIMeshViewer::draw()
94
IGUISkin* skin = Environment->getSkin();
95
video::IVideoDriver* driver = Environment->getVideoDriver();
96
core::rect<s32> viewPort = AbsoluteRect;
97
viewPort.LowerRightCorner.X -= 1;
98
viewPort.LowerRightCorner.Y -= 1;
99
viewPort.UpperLeftCorner.X += 1;
100
viewPort.UpperLeftCorner.Y += 1;
102
viewPort.clipAgainst(AbsoluteClippingRect);
106
core::rect<s32> frameRect(AbsoluteRect);
107
frameRect.LowerRightCorner.Y = frameRect.UpperLeftCorner.Y + 1;
108
skin->draw2DRectangle(this, skin->getColor(EGDC_3D_SHADOW), frameRect, &AbsoluteClippingRect);
110
frameRect.LowerRightCorner.Y = AbsoluteRect.LowerRightCorner.Y;
111
frameRect.LowerRightCorner.X = frameRect.UpperLeftCorner.X + 1;
112
skin->draw2DRectangle(this, skin->getColor(EGDC_3D_SHADOW), frameRect, &AbsoluteClippingRect);
114
frameRect = AbsoluteRect;
115
frameRect.UpperLeftCorner.X = frameRect.LowerRightCorner.X - 1;
116
skin->draw2DRectangle(this, skin->getColor(EGDC_3D_HIGH_LIGHT), frameRect, &AbsoluteClippingRect);
118
frameRect = AbsoluteRect;
119
frameRect.UpperLeftCorner.Y = AbsoluteRect.LowerRightCorner.Y - 1;
120
frameRect.LowerRightCorner.Y = AbsoluteRect.LowerRightCorner.Y;
121
skin->draw2DRectangle(this, skin->getColor(EGDC_3D_HIGH_LIGHT), frameRect, &AbsoluteClippingRect);
127
//TODO: if outside of screen, dont draw.
128
// - why is the absolute clipping rect not already the screen?
130
core::rect<s32> oldViewPort = driver->getViewPort();
132
driver->setViewPort(viewPort);
136
//CameraControl->calculateProjectionMatrix(mat);
137
//driver->setTransform(video::TS_PROJECTION, mat);
140
mat.setTranslation(core::vector3df(0,0,0));
141
driver->setTransform(video::ETS_WORLD, mat);
143
//CameraControl->calculateViewMatrix(mat);
144
//driver->setTransform(video::TS_VIEW, mat);
146
driver->setMaterial(Material);
149
if(Mesh->getFrameCount())
150
frame = (os::Timer::getTime()/20)%Mesh->getFrameCount();
151
const scene::IMesh* const m = Mesh->getMesh(frame);
152
for (u32 i=0; i<m->getMeshBufferCount(); ++i)
154
scene::IMeshBuffer* mb = m->getMeshBuffer(i);
155
driver->drawVertexPrimitiveList(mb->getVertices(),
156
mb->getVertexCount(), mb->getIndices(),
157
mb->getIndexCount()/ 3, mb->getVertexType(),
158
scene::EPT_TRIANGLES, mb->getIndexType());
161
driver->setViewPort(oldViewPort);
168
} // end namespace gui
169
} // end namespace irr
171
#endif // _IRR_COMPILE_WITH_GUI_