void R3Rectangle:: Draw(const R3DrawFlags draw_flags) const { // Check if box is empty if (IsEmpty()) return; /* Get texture coordinates */ static R2Point texcoords[4] = { R2Point(0.0, 0.0), R2Point(1.0, 0.0), R2Point(1.0, 1.0), R2Point(0.0, 1.0) }; /* Get box corner points */ R3Point corners[4]; corners[0] = Corner(RN_NN_QUADRANT); corners[1] = Corner(RN_PN_QUADRANT); corners[2] = Corner(RN_PP_QUADRANT); corners[3] = Corner(RN_NP_QUADRANT); // Draw surface if (draw_flags[R3_SURFACES_DRAW_FLAG]) { if (draw_flags[R3_SURFACE_NORMALS_DRAW_FLAG]) R3LoadNormal(Normal()); R3BeginPolygon(); for (int j = 0; j < 4; j++) { if (draw_flags[R3_VERTEX_TEXTURE_COORDS_DRAW_FLAG]) R3LoadTextureCoords(texcoords[j]); R3LoadPoint(corners[j]); } R3EndPolygon(); } // Draw edges if (draw_flags[R3_EDGES_DRAW_FLAG]) { R3BeginLoop(); for (int i = 0; i < 4; i++) R3LoadPoint(corners[i]); R3EndLoop(); } }
void R3Circle:: Draw(const R3DrawFlags draw_flags) const { // Push matrix (Zaxis -> ScaledNormal + OffsetToCenter) R4Matrix matrix = R4identity_matrix; matrix.Translate(center.Vector()); matrix.Rotate(R3posz_vector, Normal()); matrix.Push(); // Draw surface if (draw_flags[R3_SURFACES_DRAW_FLAG]) { // Load normal if (draw_flags[R3_SURFACE_NORMALS_DRAW_FLAG]) R3LoadNormal(R3posz_vector); // Draw circle in XY plane R3BeginPolygon(); for (int i = 0; i < R3circle_npoints; i++) { if (draw_flags[R3_VERTEX_TEXTURE_COORDS_DRAW_FLAG]) R3LoadTextureCoords(R3circle_texcoords[i]); R3LoadPoint(R3circle_points[i] * radius); } R3EndPolygon(); } // Draw edges if (draw_flags[R3_EDGES_DRAW_FLAG]) { R3BeginLoop(); for (int i = 0; i < R3circle_npoints; i++) R3LoadPoint(R3circle_points[i] * radius); R3EndLoop(); } // Pop matrix matrix.Pop(); }
void R3Triangle:: Draw(const R3DrawFlags draw_flags) const { // Ammend draw flags R3DrawFlags flags(Flags() & draw_flags); RNDimension dim = 0, dim1 = 0, dim2 = 0; // Unroll flags/loops for efficiency switch (flags) { case R3_SURFACES_DRAW_FLAG | R3_SURFACE_NORMALS_DRAW_FLAG: // Flat shading R3BeginPolygon(); R3LoadNormal(Normal()); R3LoadPoint(v[0]->Position()); R3LoadPoint(v[1]->Position()); R3LoadPoint(v[2]->Position()); R3EndPolygon(); break; case R3_SURFACES_DRAW_FLAG | R3_SURFACE_NORMALS_DRAW_FLAG | R3_VERTEX_NORMALS_DRAW_FLAG: // Gouraud shading R3BeginPolygon(); R3LoadNormal(v[0]->Normal()); R3LoadPoint(v[0]->Position()); R3LoadNormal(v[1]->Normal()); R3LoadPoint(v[1]->Position()); R3LoadNormal(v[2]->Normal()); R3LoadPoint(v[2]->Position()); R3EndPolygon(); break; case R3_SURFACES_DRAW_FLAG | R3_SURFACE_NORMALS_DRAW_FLAG | R3_SURFACE_TEXTURE_DRAW_FLAG | R3_VERTEX_TEXTURE_COORDS_DRAW_FLAG: // Flat shading with texture coordinates R3BeginPolygon(); R3LoadNormal(Normal()); R3LoadTextureCoords(v[0]->TextureCoords()); R3LoadPoint(v[0]->Position()); R3LoadTextureCoords(v[1]->TextureCoords()); R3LoadPoint(v[1]->Position()); R3LoadTextureCoords(v[2]->TextureCoords()); R3LoadPoint(v[2]->Position()); R3EndPolygon(); break; case R3_SURFACES_DRAW_FLAG | R3_SURFACE_NORMALS_DRAW_FLAG | R3_SURFACE_TEXTURE_DRAW_FLAG: // Flat shading with texture coordinate generation dim = Normal().MaxDimension(); dim1 = (dim + 1) % 3; dim2 = (dim + 2) % 3; R3BeginPolygon(); R3LoadNormal(Normal()); R3LoadTextureCoords(v[0]->Position()[dim1], v[0]->Position()[dim2]); R3LoadPoint(v[0]->Position()); R3LoadTextureCoords(v[1]->Position()[dim1], v[1]->Position()[dim2]); R3LoadPoint(v[1]->Position()); R3LoadTextureCoords(v[2]->Position()[dim1], v[2]->Position()[dim2]); R3LoadPoint(v[2]->Position()); R3EndPolygon(); break; case R3_SURFACES_DRAW_FLAG | R3_SURFACE_NORMALS_DRAW_FLAG | R3_VERTEX_NORMALS_DRAW_FLAG | R3_SURFACE_TEXTURE_DRAW_FLAG | R3_VERTEX_TEXTURE_COORDS_DRAW_FLAG: // Gouraud shading with texture coordinates R3BeginPolygon(); R3LoadTextureCoords(v[0]->TextureCoords()); R3LoadNormal(v[0]->Normal()); R3LoadPoint(v[0]->Position()); R3LoadTextureCoords(v[1]->TextureCoords()); R3LoadNormal(v[1]->Normal()); R3LoadPoint(v[1]->Position()); R3LoadTextureCoords(v[2]->TextureCoords()); R3LoadNormal(v[2]->Normal()); R3LoadPoint(v[2]->Position()); R3EndPolygon(); break; case R3_SURFACES_DRAW_FLAG | R3_SURFACE_NORMALS_DRAW_FLAG | R3_VERTEX_NORMALS_DRAW_FLAG | R3_SURFACE_TEXTURE_DRAW_FLAG: // Gouraud shading with texture coordinate generation dim = Normal().MaxDimension(); dim1 = (dim + 1) % 3; dim2 = (dim + 2) % 3; R3BeginPolygon(); R3LoadTextureCoords(v[0]->Position()[dim1], v[0]->Position()[dim2]); R3LoadNormal(v[0]->Normal()); R3LoadPoint(v[0]->Position()); R3LoadTextureCoords(v[1]->Position()[dim1], v[1]->Position()[dim2]); R3LoadNormal(v[1]->Normal()); R3LoadPoint(v[1]->Position()); R3LoadTextureCoords(v[2]->Position()[dim1], v[2]->Position()[dim2]); R3LoadNormal(v[2]->Normal()); R3LoadPoint(v[2]->Position()); R3EndPolygon(); break; default: // Draw surface if (flags[R3_SURFACES_DRAW_FLAG]) { // Begin polygon R3BeginPolygon(); // Load polygon normal if ((flags[R3_SURFACE_NORMALS_DRAW_FLAG]) && (!flags[R3_VERTEX_NORMALS_DRAW_FLAG])) R3LoadNormal(Normal()); // Compute stuff for texture coordinates if ((draw_flags[R3_VERTEX_TEXTURE_COORDS_DRAW_FLAG]) && (!flags[R3_VERTEX_TEXTURE_COORDS_DRAW_FLAG])) { dim = Normal().MaxDimension(); dim1 = (dim + 1) % 3; dim2 = (dim + 2) % 3; } // Load triangle vertices for (int i = 0; i < 3; i++) { // Load vertex normal if (flags[R3_VERTEX_NORMALS_DRAW_FLAG]) R3LoadNormal(v[i]->normal); // Load vertex texture coordinates if (draw_flags[R3_VERTEX_TEXTURE_COORDS_DRAW_FLAG]) { if (flags[R3_VERTEX_TEXTURE_COORDS_DRAW_FLAG]) R3LoadTextureCoords(v[i]->TextureCoords()); else R3LoadTextureCoords(v[i]->Position()[dim1], v[i]->Position()[dim2]); } // Load vertex R3LoadPoint(v[i]->Position()); } // End polygon R3EndPolygon(); } // Draw edges if (flags[R3_EDGES_DRAW_FLAG]) { R3BeginLoop(); R3LoadPoint(v[0]->Position()); R3LoadPoint(v[1]->Position()); R3LoadPoint(v[2]->Position()); R3EndLoop(); } break; } }