기본 컨셉은 원에서 축방향으로 늘리기
CChamferBoxSceneNode.h
CChamferBoxSceneNode.cpp
CChamferBoxSceneNode.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #pragma once #include <cassert> #include <irrlicht.h> using namespace irr; class CChamferBoxSceneNode : public irr::scene::IMeshSceneNode { public : CChamferBoxSceneNode(scene::ISceneNode* parent, scene::ISceneManager* smgr, s32 id, core::vector3df pos, f32 boxSize, f32 chammingFactor); ~CChamferBoxSceneNode( void ); // virtual functions virtual void OnRegisterSceneNode(); virtual void render(); virtual const core::aabbox3d<f32>& getBoundingBox() const ; virtual u32 getMaterialCount() const ; virtual video::SMaterial& getMaterial(u32 i); virtual void setMesh(scene::IMesh* mesh) {} virtual scene::IMesh* getMesh( void ) { return m_pMesh; } virtual void setReadOnlyMaterials( bool readonly) {} virtual bool isReadOnlyMaterials() const { return false ; } private : scene::IMesh* m_pMesh; f32 m_fSize; }; |
CChamferBoxSceneNode.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 | #include "CChamferBoxSceneNode.h" CChamferBoxSceneNode::CChamferBoxSceneNode(scene::ISceneNode* parent, scene::ISceneManager* smgr, s32 id, core::vector3df pos, f32 boxSize, f32 chammingFactor) : scene::IMeshSceneNode(parent, smgr, id, pos), m_pMesh(NULL), m_fSize(0.f) { assert (boxSize*0.5f > chammingFactor && "must chamfer factor less than cube size" ); // building a charmfer box scene::IMesh* sphere = smgr->getGeometryCreator()->createSphereMesh(chammingFactor, 36, 36); scene::IMeshBuffer* meshbuf = sphere->getMeshBuffer(0); video::S3DVertex* pVertex = static_cast <video::S3DVertex*>( meshbuf->getVertices()); const u32 VertexCount = meshbuf->getVertexCount(); const f32 Delta = boxSize * 0.5f - chammingFactor; for (unsigned int i=0; i< VertexCount; ++i) { if (pVertex[i].Pos.X != 0) pVertex[i].Pos.X += (pVertex[i].Pos.X > 0.f) ? Delta : -Delta; if (pVertex[i].Pos.Y != 0) pVertex[i].Pos.Y += (pVertex[i].Pos.Y > 0.f) ? Delta : -Delta; if (pVertex[i].Pos.Z != 0) pVertex[i].Pos.Z += (pVertex[i].Pos.Z > 0.f) ? Delta : -Delta; } sphere->getMeshBuffer(0)->recalculateBoundingBox(); sphere->getMeshBuffer(0)->getMaterial().AntiAliasing = true ; sphere->getMeshBuffer(0)->getMaterial().Shininess = 128.0f; m_pMesh = sphere; m_fSize = boxSize; } CChamferBoxSceneNode::~CChamferBoxSceneNode( void ) { m_pMesh->drop(); } void CChamferBoxSceneNode::OnRegisterSceneNode() { if (IsVisible) SceneManager->registerNodeForRendering( this ); ISceneNode::OnRegisterSceneNode(); } void CChamferBoxSceneNode::render() { video::IVideoDriver* driver = SceneManager->getVideoDriver(); driver->setTransform(video::ETS_WORLD, AbsoluteTransformation); driver->setMaterial( m_pMesh->getMeshBuffer(0)->getMaterial() ); driver->drawMeshBuffer( m_pMesh->getMeshBuffer(0) ); } const core::aabbox3d<f32>& CChamferBoxSceneNode::getBoundingBox() const { return m_pMesh->getMeshBuffer(0)->getBoundingBox(); } u32 CChamferBoxSceneNode::getMaterialCount() const { return 1; } video::SMaterial& CChamferBoxSceneNode::getMaterial(u32 i) { return m_pMesh->getMeshBuffer(0)->getMaterial(); } |
'Dev.Write' 카테고리의 다른 글
Irricht + bullet base sample (0) | 2011.05.11 |
---|---|
TorusKNotSceneNode (0) | 2011.05.11 |
arcball camera animator (0) | 2011.04.18 |
Ambient Occlusion (0) | 2011.04.18 |
(GLSL) cook-torrence sample (0) | 2011.04.18 |