123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- // Copyright (C) 2002-2012 Nikolaus Gebhardt
- // This file is part of the "Irrlicht Engine".
- // For conditions of distribution and use, see copyright notice in irrlicht.h
- #include "CGUIMeshViewer.h"
- #ifdef _IRR_COMPILE_WITH_GUI_
- #include "IGUIEnvironment.h"
- #include "IVideoDriver.h"
- #include "IAnimatedMesh.h"
- #include "IMesh.h"
- #include "os.h"
- #include "IGUISkin.h"
- namespace irr
- {
- namespace gui
- {
- //! constructor
- CGUIMeshViewer::CGUIMeshViewer(IGUIEnvironment* environment, IGUIElement* parent, s32 id, core::rect<s32> rectangle)
- : IGUIMeshViewer(environment, parent, id, rectangle), Mesh(0)
- {
- #ifdef _DEBUG
- setDebugName("CGUIMeshViewer");
- #endif
- }
- //! destructor
- CGUIMeshViewer::~CGUIMeshViewer()
- {
- if (Mesh)
- Mesh->drop();
- }
- //! sets the mesh to be shown
- void CGUIMeshViewer::setMesh(scene::IAnimatedMesh* mesh)
- {
- if (mesh)
- mesh->grab();
- if (Mesh)
- Mesh->drop();
- Mesh = mesh;
- /* This might be used for proper transformation etc.
- core::vector3df center(0.0f,0.0f,0.0f);
- core::aabbox3d<f32> box;
- box = Mesh->getMesh(0)->getBoundingBox();
- center = (box.MaxEdge + box.MinEdge) / 2;
- */
- }
- //! Gets the displayed mesh
- scene::IAnimatedMesh* CGUIMeshViewer::getMesh() const
- {
- return Mesh;
- }
- //! sets the material
- void CGUIMeshViewer::setMaterial(const video::SMaterial& material)
- {
- Material = material;
- }
- //! gets the material
- const video::SMaterial& CGUIMeshViewer::getMaterial() const
- {
- return Material;
- }
- //! called if an event happened.
- bool CGUIMeshViewer::OnEvent(const SEvent& event)
- {
- return IGUIElement::OnEvent(event);
- }
- //! draws the element and its children
- void CGUIMeshViewer::draw()
- {
- if (!IsVisible)
- return;
- IGUISkin* skin = Environment->getSkin();
- video::IVideoDriver* driver = Environment->getVideoDriver();
- core::rect<s32> viewPort = AbsoluteRect;
- viewPort.LowerRightCorner.X -= 1;
- viewPort.LowerRightCorner.Y -= 1;
- viewPort.UpperLeftCorner.X += 1;
- viewPort.UpperLeftCorner.Y += 1;
- viewPort.clipAgainst(AbsoluteClippingRect);
- // draw the frame
- core::rect<s32> frameRect(AbsoluteRect);
- frameRect.LowerRightCorner.Y = frameRect.UpperLeftCorner.Y + 1;
- skin->draw2DRectangle(this, skin->getColor(EGDC_3D_SHADOW), frameRect, &AbsoluteClippingRect);
- frameRect.LowerRightCorner.Y = AbsoluteRect.LowerRightCorner.Y;
- frameRect.LowerRightCorner.X = frameRect.UpperLeftCorner.X + 1;
- skin->draw2DRectangle(this, skin->getColor(EGDC_3D_SHADOW), frameRect, &AbsoluteClippingRect);
- frameRect = AbsoluteRect;
- frameRect.UpperLeftCorner.X = frameRect.LowerRightCorner.X - 1;
- skin->draw2DRectangle(this, skin->getColor(EGDC_3D_HIGH_LIGHT), frameRect, &AbsoluteClippingRect);
- frameRect = AbsoluteRect;
- frameRect.UpperLeftCorner.Y = AbsoluteRect.LowerRightCorner.Y - 1;
- skin->draw2DRectangle(this, skin->getColor(EGDC_3D_HIGH_LIGHT), frameRect, &AbsoluteClippingRect);
- // draw the mesh
- if (Mesh)
- {
- //TODO: if outside of screen, dont draw.
- // - why is the absolute clipping rect not already the screen?
- core::rect<s32> oldViewPort = driver->getViewPort();
- driver->setViewPort(viewPort);
- core::matrix4 mat;
- //CameraControl->calculateProjectionMatrix(mat);
- //driver->setTransform(video::TS_PROJECTION, mat);
- mat.makeIdentity();
- mat.setTranslation(core::vector3df(0,0,0));
- driver->setTransform(video::ETS_WORLD, mat);
- //CameraControl->calculateViewMatrix(mat);
- //driver->setTransform(video::TS_VIEW, mat);
- driver->setMaterial(Material);
- u32 frame = 0;
- if(Mesh->getFrameCount())
- frame = (os::Timer::getTime()/20)%Mesh->getFrameCount();
- const scene::IMesh* const m = Mesh->getMesh(frame);
- for (u32 i=0; i<m->getMeshBufferCount(); ++i)
- {
- scene::IMeshBuffer* mb = m->getMeshBuffer(i);
- driver->drawVertexPrimitiveList(mb->getVertices(),
- mb->getVertexCount(), mb->getIndices(),
- mb->getIndexCount()/ 3, mb->getVertexType(),
- scene::EPT_TRIANGLES, mb->getIndexType());
- }
- driver->setViewPort(oldViewPort);
- }
- IGUIElement::draw();
- }
- } // end namespace gui
- } // end namespace irr
- #endif // _IRR_COMPILE_WITH_GUI_
|