1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     demo_Cube.cpp
4 
5   Copyright (C)2009-2012 Nintendo Co., Ltd.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Rev: 46365 $
14  *---------------------------------------------------------------------------*/
15 
16 #include "demo/Body/demo_Cube.h"
17 
18 namespace demo
19 {
20 
21     /* ------------------------------------------------------------------------
22         Cube class  member function
23         ------------------------------------------------------------------------ */
24 
Cube(void)25     Cube::Cube(void) : Body()
26     {
27         for (u32 i = 0; i < 3; i++)
28         {
29             m_HalfEdges[i] = 0.5f;
30         }
31     }
32 
~Cube()33     Cube::~Cube()
34     {
35     }
36 
Initialize(void)37     void Cube::Initialize(void)
38     {
39         u32 vertexAttributes = demo::VERTEX_POSITION_ATTRIBUTE |
40             demo::VERTEX_COLOR_ATTRIBUTE |
41             demo::VERTEX_NORMAL_ATTRIBUTE;
42         InitializeCube(vertexAttributes, 0.5f, 0.5f, 0.5f);
43     }
44 
InitializeCube(const u32 vertexAttributes,const f32 halfEdgeX,const f32 halfEdgeY,const f32 halfEdgeZ)45     void Cube::InitializeCube(const u32 vertexAttributes,
46         const f32 halfEdgeX, const f32 halfEdgeY, const f32 halfEdgeZ)
47     {
48         TrianglesRenderData::Initialize();
49         DEMO_ASSERT_GL_ERROR();
50 
51         m_HalfEdges[0] = halfEdgeX;
52         m_HalfEdges[1] = halfEdgeY;
53         m_HalfEdges[2] = halfEdgeZ;
54 
55         u32 verticesNum = 24;
56         u32 trianglesNum = 12;
57         InitializeVertexBuffers(vertexAttributes, GL_TRIANGLES,
58             verticesNum, trianglesNum);
59 
60         SetPackedVerticesNum(verticesNum);
61         SetPackedTrianglesNum(trianglesNum);
62         SetPackedArraysSize();
63 
64         if ( m_VertexAttributes & demo::VERTEX_POSITION_ATTRIBUTE )
65         {
66             // -Y face
67             SetPosition(0, (- m_HalfEdges[0]), (- m_HalfEdges[1]), (- m_HalfEdges[2]) );
68             SetPosition(1, (- m_HalfEdges[0]), (- m_HalfEdges[1]), (+ m_HalfEdges[2]) );
69             SetPosition(2, (+ m_HalfEdges[0]), (- m_HalfEdges[1]), (+ m_HalfEdges[2]) );
70             SetPosition(3, (+ m_HalfEdges[0]), (- m_HalfEdges[1]), (- m_HalfEdges[2]) );
71 
72             // +Y face
73             SetPosition(4, (- m_HalfEdges[0]), (+ m_HalfEdges[1]), (- m_HalfEdges[2]) );
74             SetPosition(5, (+ m_HalfEdges[0]), (+ m_HalfEdges[1]), (- m_HalfEdges[2]) );
75             SetPosition(6, (+ m_HalfEdges[0]), (+ m_HalfEdges[1]), (+ m_HalfEdges[2]) );
76             SetPosition(7, (- m_HalfEdges[0]), (+ m_HalfEdges[1]), (+ m_HalfEdges[2]) );
77 
78             // -Z face
79             SetPosition(8,  (- m_HalfEdges[0]), (- m_HalfEdges[1]), (- m_HalfEdges[2]) );
80             SetPosition(9,  (+ m_HalfEdges[0]), (- m_HalfEdges[1]), (- m_HalfEdges[2]) );
81             SetPosition(10, (+ m_HalfEdges[0]), (+ m_HalfEdges[1]), (- m_HalfEdges[2]) );
82             SetPosition(11, (- m_HalfEdges[0]), (+ m_HalfEdges[1]), (- m_HalfEdges[2]) );
83 
84             // +Z face
85             SetPosition(12, (- m_HalfEdges[0]), (- m_HalfEdges[1]), (+ m_HalfEdges[2]) );
86             SetPosition(13, (- m_HalfEdges[0]), (+ m_HalfEdges[1]), (+ m_HalfEdges[2]) );
87             SetPosition(14, (+ m_HalfEdges[0]), (+ m_HalfEdges[1]), (+ m_HalfEdges[2]) );
88             SetPosition(15, (+ m_HalfEdges[0]), (- m_HalfEdges[1]), (+ m_HalfEdges[2]) );
89 
90             // -X face
91             SetPosition(16, (- m_HalfEdges[0]), (- m_HalfEdges[1]), (- m_HalfEdges[2]) );
92             SetPosition(17, (- m_HalfEdges[0]), (+ m_HalfEdges[1]), (- m_HalfEdges[2]) );
93             SetPosition(18, (- m_HalfEdges[0]), (+ m_HalfEdges[1]), (+ m_HalfEdges[2]) );
94             SetPosition(19, (- m_HalfEdges[0]), (- m_HalfEdges[1]), (+ m_HalfEdges[2]) );
95 
96             // +X face
97             SetPosition(20, (+ m_HalfEdges[0]), (- m_HalfEdges[1]), (- m_HalfEdges[2]) );
98             SetPosition(21, (+ m_HalfEdges[0]), (- m_HalfEdges[1]), (+ m_HalfEdges[2]) );
99             SetPosition(22, (+ m_HalfEdges[0]), (+ m_HalfEdges[1]), (+ m_HalfEdges[2]) );
100             SetPosition(23, (+ m_HalfEdges[0]), (+ m_HalfEdges[1]), (- m_HalfEdges[2]) );
101         }
102 
103         if ( m_VertexAttributes & demo::VERTEX_COLOR_ATTRIBUTE )
104         {
105             demo::TrianglesRenderData::SetColor(1.0f, 0.0f, 0.0f, 1.0f);
106         }
107 
108         if ( m_VertexAttributes & demo::VERTEX_TEXCOORD_ATTRIBUTE )
109         {
110             // -Y face
111             SetTexcoord(0, 0.0f, 0.0f);
112             SetTexcoord(1, 1.0f, 0.0f);
113             SetTexcoord(2, 1.0f, 1.0f);
114             SetTexcoord(3, 0.0f, 1.0f);
115 
116             // +Y face
117             SetTexcoord(4, 0.0f, 1.0f);
118             SetTexcoord(5, 1.0f, 1.0f);
119             SetTexcoord(6, 1.0f, 0.0f);
120             SetTexcoord(7, 0.0f, 0.0f);
121 
122             // -Z face
123             SetTexcoord(8, 1.0f, 0.0f);
124             SetTexcoord(9, 0.0f, 0.0f);
125             SetTexcoord(10, 0.0f, 1.0f);
126             SetTexcoord(11, 1.0f, 1.0f);
127 
128             // +Z face
129             SetTexcoord(12, 0.0f, 0.0f);
130             SetTexcoord(13, 0.0f, 1.0f);
131             SetTexcoord(14, 1.0f, 1.0f);
132             SetTexcoord(15, 1.0f, 0.0f);
133 
134             // -X face
135             SetTexcoord(16, 0.0f, 0.0f);
136             SetTexcoord(17, 0.0f, 1.0f);
137             SetTexcoord(18, 1.0f, 1.0f);
138             SetTexcoord(19, 1.0f, 0.0f);
139 
140             // +X face
141             SetTexcoord(20, 1.0f, 0.0f);
142             SetTexcoord(21, 0.0f, 0.0f);
143             SetTexcoord(22, 0.0f, 1.0f);
144             SetTexcoord(23, 1.0f, 1.0f);
145         }
146 
147         if ( m_VertexAttributes & demo::VERTEX_NORMAL_ATTRIBUTE )
148         {
149             // -Y face
150             u32 faceIndex = 0;
151             for (u32 i = 0; i < 4; i++)
152             {
153                 SetNormal(4 * faceIndex + i, 0.0f, (- 1.0f), 0.0f);
154             }
155 
156             // +Y face
157             faceIndex = 1;
158             for (u32 i = 0; i < 4; i++)
159             {
160                 SetNormal(4 * faceIndex + i, 0.0f, 1.0f, 0.0f);
161             }
162 
163             // -Z face
164             faceIndex = 2;
165             for (u32 i = 0; i < 4; i++)
166             {
167                 SetNormal(4 * faceIndex + i, 0.0f, 0.0f, (- 1.0f));
168             }
169 
170             // +Z face
171             faceIndex = 3;
172             for (u32 i = 0; i < 4; i++)
173             {
174                 SetNormal(4 * faceIndex + i, 0.0f, 0.0f, 1.0f);
175             }
176 
177             // -X face
178             faceIndex = 4;
179             for (u32 i = 0; i < 4; i++)
180             {
181                 SetNormal(4 * faceIndex + i, (- 1.0f), 0.0f, 0.0f);
182             }
183 
184             // +X face
185             faceIndex = 5;
186             for (u32 i = 0; i < 4; i++)
187             {
188                 SetNormal(4 * faceIndex + i, 1.0f, 0.0f, 0.0f);
189             }
190         }
191 
192         if ( m_VertexAttributes & demo::VERTEX_TANGENT_ATTRIBUTE )
193         {
194             NN_TPANIC_("Tangent attribute is not implemented.");
195         }
196 
197         // -Y face
198         SetIndex(0, 0, 2, 1);
199         SetIndex(1, 0, 3, 2);
200 
201         // +Y face
202         SetIndex(2, 4, 6, 5);
203         SetIndex(3, 4, 7, 6);
204 
205         // -Z face
206         SetIndex(4, 8, 10, 9);
207         SetIndex(5, 8, 11, 10);
208 
209         // +Z face
210         SetIndex(6, 12, 14, 13);
211         SetIndex(7, 12, 15, 14);
212 
213         // -X face
214         SetIndex(8, 16, 18, 17);
215         SetIndex(9, 16, 19, 18);
216 
217         // +X face
218         SetIndex(10, 20, 22, 21);
219         SetIndex(11, 20, 23, 22);
220 
221         UpdateBuffers();
222         SetUpdateBufferBeforeDraw(false);
223 
224         DEMO_ASSERT_GL_ERROR();
225     }
226 
227 }
228