]> git.lizzy.rs Git - irrlicht.git/blob - include/CDynamicMeshBuffer.h
Add a unified cross platform OpenGL core profile binding (#52)
[irrlicht.git] / include / CDynamicMeshBuffer.h
1 // Copyright (C) 2008-2012 Nikolaus Gebhardt\r
2 // This file is part of the "Irrlicht Engine".\r
3 // For conditions of distribution and use, see copyright notice in irrlicht.h\r
4 \r
5 #ifndef __C_DYNAMIC_MESHBUFFER_H_INCLUDED__\r
6 #define __C_DYNAMIC_MESHBUFFER_H_INCLUDED__\r
7 \r
8 #include "IDynamicMeshBuffer.h"\r
9 \r
10 #include "CVertexBuffer.h"\r
11 #include "CIndexBuffer.h"\r
12 \r
13 namespace irr\r
14 {\r
15 namespace scene\r
16 {\r
17 \r
18         class CDynamicMeshBuffer: public IDynamicMeshBuffer\r
19         {\r
20         public:\r
21                 //! constructor\r
22                 CDynamicMeshBuffer(video::E_VERTEX_TYPE vertexType, video::E_INDEX_TYPE indexType)\r
23                 : PrimitiveType(EPT_TRIANGLES)\r
24                 {\r
25                         VertexBuffer=new CVertexBuffer(vertexType);\r
26                         IndexBuffer=new CIndexBuffer(indexType);\r
27                 }\r
28 \r
29                 //! destructor\r
30                 virtual ~CDynamicMeshBuffer()\r
31                 {\r
32                         if (VertexBuffer)\r
33                                 VertexBuffer->drop();\r
34                         if (IndexBuffer)\r
35                                 IndexBuffer->drop();\r
36                 }\r
37 \r
38                 virtual IVertexBuffer& getVertexBuffer() const _IRR_OVERRIDE_\r
39                 {\r
40                         return *VertexBuffer;\r
41                 }\r
42 \r
43                 virtual IIndexBuffer& getIndexBuffer() const _IRR_OVERRIDE_\r
44                 {\r
45                         return *IndexBuffer;\r
46                 }\r
47 \r
48                 virtual void setVertexBuffer(IVertexBuffer *newVertexBuffer) _IRR_OVERRIDE_\r
49                 {\r
50                         if (newVertexBuffer)\r
51                                 newVertexBuffer->grab();\r
52                         if (VertexBuffer)\r
53                                 VertexBuffer->drop();\r
54 \r
55                         VertexBuffer=newVertexBuffer;\r
56                 }\r
57 \r
58                 virtual void setIndexBuffer(IIndexBuffer *newIndexBuffer) _IRR_OVERRIDE_\r
59                 {\r
60                         if (newIndexBuffer)\r
61                                 newIndexBuffer->grab();\r
62                         if (IndexBuffer)\r
63                                 IndexBuffer->drop();\r
64 \r
65                         IndexBuffer=newIndexBuffer;\r
66                 }\r
67 \r
68                 //! Get Material of this buffer.\r
69                 virtual const video::SMaterial& getMaterial() const _IRR_OVERRIDE_\r
70                 {\r
71                         return Material;\r
72                 }\r
73 \r
74                 //! Get Material of this buffer.\r
75                 virtual video::SMaterial& getMaterial() _IRR_OVERRIDE_\r
76                 {\r
77                         return Material;\r
78                 }\r
79 \r
80                 //! Get bounding box\r
81                 virtual const core::aabbox3d<f32>& getBoundingBox() const _IRR_OVERRIDE_\r
82                 {\r
83                         return BoundingBox;\r
84                 }\r
85 \r
86                 //! Set bounding box\r
87                 virtual void setBoundingBox( const core::aabbox3df& box) _IRR_OVERRIDE_\r
88                 {\r
89                         BoundingBox = box;\r
90                 }\r
91 \r
92                 //! Recalculate bounding box\r
93                 virtual void recalculateBoundingBox() _IRR_OVERRIDE_\r
94                 {\r
95                         if (!getVertexBuffer().size())\r
96                                 BoundingBox.reset(0,0,0);\r
97                         else\r
98                         {\r
99                                 BoundingBox.reset(getVertexBuffer()[0].Pos);\r
100                                 for (u32 i=1; i<getVertexBuffer().size(); ++i)\r
101                                         BoundingBox.addInternalPoint(getVertexBuffer()[i].Pos);\r
102                         }\r
103                 }\r
104 \r
105                 //! Describe what kind of primitive geometry is used by the meshbuffer\r
106                 virtual void setPrimitiveType(E_PRIMITIVE_TYPE type) _IRR_OVERRIDE_\r
107                 {\r
108                         PrimitiveType = type;\r
109                 }\r
110 \r
111                 //! Get the kind of primitive geometry which is used by the meshbuffer\r
112                 virtual E_PRIMITIVE_TYPE getPrimitiveType() const _IRR_OVERRIDE_\r
113                 {\r
114                         return PrimitiveType;\r
115                 }\r
116 \r
117                 video::SMaterial Material;\r
118                 core::aabbox3d<f32> BoundingBox;\r
119                 //! Primitive type used for rendering (triangles, lines, ...)\r
120                 E_PRIMITIVE_TYPE PrimitiveType;\r
121         private:\r
122                 CDynamicMeshBuffer(const CDynamicMeshBuffer&); // = delete in c++11, prevent copying\r
123 \r
124                 IVertexBuffer *VertexBuffer;\r
125                 IIndexBuffer *IndexBuffer;\r
126         };\r
127 \r
128 \r
129 } // end namespace scene\r
130 } // end namespace irr\r
131 \r
132 #endif\r
133 \r