모서리가 둥근 박스 만들기

Dev.Write 2011. 4. 18. 23:21 Posted by zetz
기본 컨셉은 원에서 축방향으로 늘리기

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