1#pragma once
2
3#include <nn/gfx/gfx_Enum.h>
4#include <nn/util.h>
5
6namespace nn::gfx::util {
7
8enum PrimitiveShapeFormat {
9 PrimitiveShapeFormat_Pos = 0x1,
10 PrimitiveShapeFormat_Normal = 0x2,
11 PrimitiveShapeFormat_Uv = 0x4,
12 PrimitiveShapeFormat_Default = 0x7
13};
14
15class PrimitiveShape {
16 NN_NO_COPY(PrimitiveShape);
17
18public:
19 virtual ~PrimitiveShape();
20 void* GetIndexBuffer() const;
21 void* GetVertexBuffer() const;
22 size_t GetStride() const;
23 size_t GetVertexBufferSize() const;
24 size_t GetIndexBufferSize() const;
25 PrimitiveShapeFormat GetVertexFormat() const;
26 PrimitiveTopology GetPrimitiveTopology() const;
27 size_t GetIndexBufferAlignment() const;
28 IndexFormat GetIndexBufferFormat() const;
29 int GetVertexCount() const;
30 int GetIndexCount() const;
31 void Calculate(void*, size_t, void*, size_t);
32
33protected:
34 PrimitiveShape(PrimitiveShapeFormat, PrimitiveTopology);
35
36 virtual void CalculateImpl(void*, size_t, void*, size_t) = 0;
37 void SetVertexBuffer(void*);
38 void SetIndexBuffer(void*);
39 void SetVertexBufferSize(size_t);
40 void SetIndexBufferSize(size_t);
41 void SetVertexCount(int);
42 void SetIndexCount(int);
43
44private:
45 void* m_pIndexBuffer;
46 void* m_pVertexBuffer;
47 PrimitiveShapeFormat m_VertexFormat;
48 IndexFormat m_IndexBufferFormat;
49 PrimitiveTopology m_PrimitiveTopology;
50 int m_VertexCount;
51 int m_IndexCount;
52 size_t m_VertexBufferSize;
53 size_t m_IndexBufferSize;
54};
55
56class SphereShape : public PrimitiveShape {
57 NN_NO_COPY(SphereShape);
58
59public:
60 SphereShape(PrimitiveShapeFormat, PrimitiveTopology, int, int);
61
62 virtual ~SphereShape();
63
64protected:
65 int CalculateVertexCount();
66 int CalculateIndexCount();
67 void CalculateImpl(void*, size_t, void*, size_t);
68
69private:
70 template <typename T>
71 void CalculateIndexBuffer();
72
73 void* CalculateVertexBuffer();
74
75 int m_SliceCount;
76 int m_StackCount;
77};
78
79class CircleShape : public PrimitiveShape {
80public:
81 CircleShape(PrimitiveShapeFormat, PrimitiveTopology, int);
82 virtual ~CircleShape();
83
84protected:
85 int CalculateVertexCount();
86 int CalculateIndexCount();
87 virtual void CalculateImpl(void*, size_t, void*, size_t);
88
89private:
90 void* CalculateVertexBuffer();
91
92 template <typename T>
93 void CalculateIndexBuffer();
94
95 int m_SliceCount;
96};
97
98class CubeShape : public PrimitiveShape {
99public:
100 CubeShape(PrimitiveShapeFormat, PrimitiveTopology);
101 virtual ~CubeShape();
102
103protected:
104 int CalculateVertexCount();
105 int CalculateIndexCount();
106 virtual void CalculateImpl(void*, size_t, void*, size_t);
107
108 enum CubeVertex { CubeVertexCount_Wired = 8, CubeVertexCount_Solid = 24 };
109 enum CubeIndex { CubeIndexCount_Wired = 48, CubeIndexCount_Solid = 36 };
110
111private:
112 void* CalculateVertexBuffer();
113
114 template <typename T>
115 void CalculateIndexBuffer();
116};
117
118class QuadShape : public PrimitiveShape {
119public:
120 QuadShape(PrimitiveShapeFormat, PrimitiveTopology);
121 virtual ~QuadShape();
122
123protected:
124 int CalculateVertexCount();
125 int CalculateIndexCount();
126 virtual void CalculateImpl(void*, size_t, void*, size_t);
127
128 enum QuadVertex { QuadVertexCount = 4 };
129
130 enum QuadIndex { QuadIndexCount_Wired = 5, QuadIndexCountt_Solid = 6 };
131
132private:
133 void* CalculateVertexBuffer();
134
135 template <typename T>
136 void CalculateIndexBuffer();
137};
138
139class HemiSphereShape : public PrimitiveShape {
140public:
141 HemiSphereShape(PrimitiveShapeFormat, PrimitiveTopology, int);
142 virtual ~HemiSphereShape();
143
144protected:
145 int CalculateVertexCount();
146 int CalculateIndexCount();
147 virtual void CalculateImpl(void*, size_t, void*, size_t);
148
149private:
150 void* CalculateVertexBuffer();
151
152 template <typename T>
153 void CalculateIndexBuffer();
154
155 int m_SliceCount;
156};
157
158class PipeShape : public PrimitiveShape {
159public:
160 PipeShape(PrimitiveShapeFormat, PrimitiveTopology, int);
161 virtual ~PipeShape();
162
163protected:
164 int CalculateVertexCount();
165 int CalculateIndexCount();
166 virtual void CalculateImpl(void*, size_t, void*, size_t);
167
168private:
169 void* CalculateVertexBuffer();
170
171 template <typename T>
172 void CalculateIndexBuffer();
173
174 int m_SliceCount;
175};
176
177class CylinderShape : public PrimitiveShape {
178public:
179 CylinderShape(PrimitiveShapeFormat, PrimitiveTopology, int);
180 virtual ~CylinderShape();
181
182protected:
183 int CalculateVertexCount();
184 int CalculateIndexCount();
185 virtual void CalculateImpl(void*, size_t, void*, size_t);
186
187private:
188 void* CalculateVertexBuffer();
189
190 template <typename T>
191 void CalculateIndexBuffer();
192
193 int m_SliceCount;
194};
195
196class ConeShape : public PrimitiveShape {
197public:
198 ConeShape(PrimitiveShapeFormat, PrimitiveTopology, int);
199 virtual ~ConeShape();
200
201protected:
202 int CalculateVertexCount();
203 int CalculateIndexCount();
204 virtual void CalculateImpl(void*, size_t, void*, size_t);
205
206private:
207 void* CalculateVertexBuffer();
208
209 template <typename T>
210 void CalculateIndexBuffer();
211
212 int m_SliceCount;
213};
214
215} // namespace nn::gfx::util