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