OSG::NodePtr makePolygon(double pntData[][3], int numPoints) { OSG::GeometryPtr geoPtr = OSG::Geometry::create(); OSG::NodePtr nodePtr = OSG::Node::create(); GeoPositions3fPtr pnts = GeoPositions3f::create(); GeoNormals3fPtr norms = GeoNormals3f::create(); GeoTexCoords2fPtr tex = GeoTexCoords2f::create(); GeoIndicesUI32Ptr indices = GeoIndicesUI32::create(); GeoPLengthsUI32Ptr lens = GeoPLengthsUI32::create(); GeoPTypesUI8Ptr types = GeoPTypesUI8::create(); //Set up the properties according to the geometry defined above beginEditCP(pnts); beginEditCP(norms); for(int i = 0; i < numPoints; i++) { pnts->push_back(Pnt3f(pntData[i][0], pntData[i][1], pntData[i][2])); indices->push_back(2*i); norms->push_back(Vec3f(0.0, 0.0, pntData[i][2])); indices->push_back(2*i + 1); } endEditCP(pnts); endEditCP(norms); beginEditCP(types); beginEditCP(lens); types->push_back(GL_POLYGON); lens->push_back(numPoints); endEditCP(types); endEditCP(lens); beginEditCP(geoPtr); geoPtr->setMaterial(getDefaultMaterial()); geoPtr->setPositions(pnts); geoPtr->setNormals(norms); geoPtr->setIndices(indices); geoPtr->editMFIndexMapping()->push_back(Geometry::MapPosition | Geometry::MapNormal); geoPtr->setTypes(types); geoPtr->setLengths(lens); endEditCP(geoPtr); nodePtr->setCore(geoPtr); return nodePtr; }
GeometryPtr createGeo(UInt32 mat) { GeoIndicesPtr ind = _ind[mat]; FDEBUG(("CreateGeoRec::createGeo: Mat %d: %d inds (%d tris)\n", mat, ind->getSize(), ind->getSize()/3)); endEditCP(ind); GeometryPtr geo = Geometry::create(); GeoPLengthsUI32Ptr len = GeoPLengthsUI32::create(); beginEditCP(len); len->push_back(ind->getSize()); endEditCP(len); GeoPTypesUI8Ptr typ = GeoPTypesUI8::create(); beginEditCP(typ); typ->push_back(GL_TRIANGLES); endEditCP(typ); beginEditCP(geo); if(random_color) { SimpleMaterialPtr mat = SimpleMaterial::create(); beginEditCP(mat); Color3f c( drand48() * .7f + .3f, drand48() * .7f + .3f, drand48() * .7f + .3f); mat->setDiffuse(c); mat->setSpecular(Color3f(1.f,1.f,1.f)); mat->setShininess(10.f); endEditCP(mat); geo->setMaterial(mat); } else { geo->setMaterial(MaterialPool::getMaterial(mat)); } geo->setPositions(_pos); geo->setIndices(ind); geo->setLengths(len); geo->setTypes(typ); geo->getIndexMapping().push_back(Geometry::MapPosition); endEditCP(geo); calcVertexNormals(geo); //calcFaceNormals(geo); createSingleIndex(geo); return geo; }
// Create the coordinate cross NodePtr createCoordinateCross() { GeometryPtr geoPtr = Geometry::create(); beginEditCP(geoPtr); { GeoPTypesUI8Ptr typesPtr = GeoPTypesUI8::create(); typesPtr->push_back(GL_LINES); geoPtr->setTypes(typesPtr); GeoPLengthsUI32Ptr lensPtr = GeoPLengthsUI32::create(); lensPtr->push_back(6); geoPtr->setLengths(lensPtr); GeoPositions3fPtr posPtr = GeoPositions3f::create(); posPtr->push_back(Vec3f(-0.1f, 0.f, 0.f)); posPtr->push_back(Vec3f(1.f, 0.f, 0.f)); posPtr->push_back(Vec3f(0.f, -0.1f, 0.f)); posPtr->push_back(Vec3f(0.f, 1.f, 0.f)); posPtr->push_back(Vec3f(0.f, 0.f, -0.1f)); posPtr->push_back(Vec3f(0.f, 0.f, 1.f)); geoPtr->setPositions(posPtr); GeoColors3fPtr colorsPtr = GeoColors3f::create(); colorsPtr->push_back(Color3f(1.f, 0.f, 0.f)); colorsPtr->push_back(Color3f(0.f, 1.f, 0.f)); colorsPtr->push_back(Color3f(0.f, 0.f, 1.f)); geoPtr->setColors(colorsPtr); GeoIndicesUI32Ptr indicesPtr = GeoIndicesUI32::create(); // X Axis indicesPtr->push_back(0); indicesPtr->push_back(0); indicesPtr->push_back(1); indicesPtr->push_back(0); // Y Axis indicesPtr->push_back(2); indicesPtr->push_back(1); indicesPtr->push_back(3); indicesPtr->push_back(1); // Z Axis indicesPtr->push_back(4); indicesPtr->push_back(2); indicesPtr->push_back(5); indicesPtr->push_back(2); geoPtr->setIndices(indicesPtr); geoPtr->editMFIndexMapping()->clear(); geoPtr->editMFIndexMapping()->push_back(Geometry::MapPosition); geoPtr->editMFIndexMapping()->push_back(Geometry::MapColor); SimpleMaterialPtr matPtr = SimpleMaterial::create(); geoPtr->setMaterial(matPtr); } endEditCP(geoPtr); NodePtr nodePtr = Node::create(); beginEditCP(nodePtr, Node::CoreFieldMask); { nodePtr->setCore(geoPtr); } endEditCP(nodePtr, Node::CoreFieldMask); return nodePtr; }
// Create the metrics NodePtr createMetrics(TextFace *face, Real32 scale, const TextLayoutParam &layoutParam, const TextLayoutResult &layoutResult) { GeometryPtr geoPtr = Geometry::create(); beginEditCP(geoPtr); { GeoPTypesUI8Ptr typesPtr = GeoPTypesUI8::create(); geoPtr->setTypes(typesPtr); GeoPLengthsUI32Ptr lensPtr = GeoPLengthsUI32::create(); geoPtr->setLengths(lensPtr); GeoPositions3fPtr posPtr = GeoPositions3f::create(); geoPtr->setPositions(posPtr); GeoColors3fPtr colorsPtr = GeoColors3f::create(); colorsPtr->push_back(Color3f(0.f, 0.f, 1.f)); colorsPtr->push_back(Color3f(1.f, 0.f, 0.f)); colorsPtr->push_back(Color3f(0.f, 1.f, 0.f)); colorsPtr->push_back(Color3f(1.f, 1.f, 0.f)); geoPtr->setColors(colorsPtr); GeoIndicesUI32Ptr indicesPtr = GeoIndicesUI32::create(); geoPtr->setIndices(indicesPtr); UInt32 i, numGlyphs = layoutResult.getNumGlyphs(); for (i = 0; i < numGlyphs; ++i) { const TextGlyph &glyph = face->getGlyph(layoutResult.indices[i]); typesPtr->push_back(GL_LINE_LOOP); lensPtr->push_back(4); const Vec2f &pos = layoutResult.positions[i]; Real32 left = pos.x() * scale; Real32 right = (pos.x() + glyph.getWidth()) * scale; Real32 top = pos.y() * scale; Real32 bottom = (pos.y() - glyph.getHeight()) * scale; UInt32 posOffset = posPtr->size(); posPtr->push_back(Vec3f(left, bottom, 0.f)); posPtr->push_back(Vec3f(right, bottom, 0.f)); posPtr->push_back(Vec3f(right, top, 0.f)); posPtr->push_back(Vec3f(left, top, 0.f)); indicesPtr->push_back(posOffset); indicesPtr->push_back(0); indicesPtr->push_back(posOffset + 1); indicesPtr->push_back(0); indicesPtr->push_back(posOffset + 2); indicesPtr->push_back(0); indicesPtr->push_back(posOffset + 3); indicesPtr->push_back(0); } // Bounding box Vec2f lowerLeft, upperRight; face->calculateBoundingBox(layoutResult, lowerLeft, upperRight); typesPtr->push_back(GL_LINE_LOOP); lensPtr->push_back(4); Real32 left = lowerLeft.x() * scale; Real32 right = upperRight.x() * scale; Real32 top = upperRight.y() * scale; Real32 bottom = lowerLeft.y() * scale; UInt32 posOffset = posPtr->size(); posPtr->push_back(Vec3f(left, bottom, 0.f)); posPtr->push_back(Vec3f(right, bottom, 0.f)); posPtr->push_back(Vec3f(right, top, 0.f)); posPtr->push_back(Vec3f(left, top, 0.f)); indicesPtr->push_back(posOffset); indicesPtr->push_back(1); indicesPtr->push_back(posOffset + 1); indicesPtr->push_back(1); indicesPtr->push_back(posOffset + 2); indicesPtr->push_back(1); indicesPtr->push_back(posOffset + 3); indicesPtr->push_back(1); // Text bounds & Line bounds Vec2f pos, textPos, offset; if (layoutParam.horizontal == true) { Real32 lineHeight = face->getHoriAscent() - face->getHoriDescent(); Real32 spacing = layoutParam.spacing * lineHeight; if (layoutParam.topToBottom == true) { switch (layoutParam.minorAlignment) { case TextLayoutParam::ALIGN_BEGIN: break; case TextLayoutParam::ALIGN_FIRST: pos[1] = textPos[1] = face->getHoriAscent(); break; case TextLayoutParam::ALIGN_MIDDLE: pos[1] = textPos[1] = (spacing * (layoutResult.lineBounds.size() - 1) + lineHeight) / 2.f; break; case TextLayoutParam::ALIGN_END: pos[1] = textPos[1] = spacing * (layoutResult.lineBounds.size() - 1) + lineHeight; break; } offset.setValues(0.f, -spacing); } else { switch (layoutParam.minorAlignment) { case TextLayoutParam::ALIGN_BEGIN: pos[1] = lineHeight; textPos[1] = spacing * (layoutResult.lineBounds.size() - 1) + lineHeight; break; case TextLayoutParam::ALIGN_FIRST: pos[1] = face->getHoriAscent(); textPos[1] = spacing * (layoutResult.lineBounds.size() - 1) + face->getHoriAscent(); break; case TextLayoutParam::ALIGN_MIDDLE: pos[1] = -(spacing * (layoutResult.lineBounds.size() - 1) + lineHeight) / 2.f + lineHeight; textPos[1] = (spacing * (layoutResult.lineBounds.size() - 1) + lineHeight) / 2.f; break; case TextLayoutParam::ALIGN_END: pos[1] = -spacing * (layoutResult.lineBounds.size() - 1); break; } offset.setValues(0.f, spacing); } } else { Real32 lineHeight = face->getVertDescent() - face->getVertAscent(); Real32 spacing = layoutParam.spacing * lineHeight; if (layoutParam.leftToRight == true) { switch (layoutParam.minorAlignment) { case TextLayoutParam::ALIGN_BEGIN: break; case TextLayoutParam::ALIGN_FIRST: pos[0] = textPos[0] = face->getVertAscent(); break; case TextLayoutParam::ALIGN_MIDDLE: pos[0] = textPos[0] = -(spacing * (layoutResult.lineBounds.size() - 1) + lineHeight) / 2.f; break; case TextLayoutParam::ALIGN_END: pos[0] = textPos[0] = -spacing * (layoutResult.lineBounds.size() - 1) - lineHeight; break; } offset.setValues(spacing, 0.f); } else { switch (layoutParam.minorAlignment) { case TextLayoutParam::ALIGN_BEGIN: pos[0] = -lineHeight; textPos[0] = -spacing * (layoutResult.lineBounds.size() - 1) - lineHeight; break; case TextLayoutParam::ALIGN_FIRST: pos[0] = -face->getVertDescent(); textPos[0] = -spacing * (layoutResult.lineBounds.size() - 1) -face->getVertDescent(); break; case TextLayoutParam::ALIGN_MIDDLE: pos[0] = (spacing * (layoutResult.lineBounds.size() - 1) + lineHeight) / 2.f - lineHeight; textPos[0] = -(spacing * (layoutResult.lineBounds.size() - 1) + lineHeight) / 2.f; break; case TextLayoutParam::ALIGN_END: pos[0] = spacing * (layoutResult.lineBounds.size() - 1); break; } offset.setValues(-spacing, 0.f); } } typesPtr->push_back(GL_LINE_LOOP); lensPtr->push_back(4); left = textPos.x(); top = textPos.y(); if (layoutParam.horizontal == true) if (layoutParam.leftToRight == true) switch (layoutParam.majorAlignment) { case TextLayoutParam::ALIGN_BEGIN: case TextLayoutParam::ALIGN_FIRST: break; case TextLayoutParam::ALIGN_MIDDLE: left -= layoutResult.textBounds.x() / 2.f; break; case TextLayoutParam::ALIGN_END: left -= layoutResult.textBounds.x(); break; } else switch (layoutParam.majorAlignment) { case TextLayoutParam::ALIGN_BEGIN: case TextLayoutParam::ALIGN_FIRST: left -= layoutResult.textBounds.x(); break; case TextLayoutParam::ALIGN_MIDDLE: left -= layoutResult.textBounds.x() / 2.f; break; case TextLayoutParam::ALIGN_END: break; } else if (layoutParam.topToBottom == true) switch (layoutParam.majorAlignment) { case TextLayoutParam::ALIGN_BEGIN: case TextLayoutParam::ALIGN_FIRST: break; case TextLayoutParam::ALIGN_MIDDLE: top += layoutResult.textBounds.y() / 2.f; break; case TextLayoutParam::ALIGN_END: top += layoutResult.textBounds.y(); break; } else switch (layoutParam.majorAlignment) { case TextLayoutParam::ALIGN_BEGIN: case TextLayoutParam::ALIGN_FIRST: top += layoutResult.textBounds.y(); break; case TextLayoutParam::ALIGN_MIDDLE: top += layoutResult.textBounds.y() / 2.f; break; case TextLayoutParam::ALIGN_END: break; } left *= scale; right = left + layoutResult.textBounds.x() * scale; top *= scale; bottom = top - layoutResult.textBounds.y() * scale; posOffset = posPtr->size(); posPtr->push_back(Vec3f(left, bottom, 0.f)); posPtr->push_back(Vec3f(right, bottom, 0.f)); posPtr->push_back(Vec3f(right, top, 0.f)); posPtr->push_back(Vec3f(left, top, 0.f)); indicesPtr->push_back(posOffset); indicesPtr->push_back(3); indicesPtr->push_back(posOffset + 1); indicesPtr->push_back(3); indicesPtr->push_back(posOffset + 2); indicesPtr->push_back(3); indicesPtr->push_back(posOffset + 3); indicesPtr->push_back(3); vector<Vec2f>::const_iterator lbIt; for (lbIt = layoutResult.lineBounds.begin(); lbIt != layoutResult.lineBounds.end(); ++lbIt) { typesPtr->push_back(GL_LINE_LOOP); lensPtr->push_back(4); Real32 left = pos.x(); Real32 top = pos.y(); if (layoutParam.horizontal == true) if (layoutParam.leftToRight == true) switch (layoutParam.majorAlignment) { case TextLayoutParam::ALIGN_BEGIN: case TextLayoutParam::ALIGN_FIRST: break; case TextLayoutParam::ALIGN_MIDDLE: left -= lbIt->x() / 2.f; break; case TextLayoutParam::ALIGN_END: left -= lbIt->x(); break; } else switch (layoutParam.majorAlignment) { case TextLayoutParam::ALIGN_BEGIN: case TextLayoutParam::ALIGN_FIRST: left -= lbIt->x(); break; case TextLayoutParam::ALIGN_MIDDLE: left -= lbIt->x() / 2.f; break; case TextLayoutParam::ALIGN_END: break; } else if (layoutParam.topToBottom == true) switch (layoutParam.majorAlignment) { case TextLayoutParam::ALIGN_BEGIN: case TextLayoutParam::ALIGN_FIRST: break; case TextLayoutParam::ALIGN_MIDDLE: top += lbIt->y() / 2.f; break; case TextLayoutParam::ALIGN_END: top += lbIt->y(); break; } else switch (layoutParam.majorAlignment) { case TextLayoutParam::ALIGN_BEGIN: case TextLayoutParam::ALIGN_FIRST: top += lbIt->y(); break; case TextLayoutParam::ALIGN_MIDDLE: top += lbIt->y() / 2.f; break; case TextLayoutParam::ALIGN_END: break; } left *= scale; Real32 right = left + lbIt->x() * scale; top *= scale; Real32 bottom = top - lbIt->y() * scale; UInt32 posOffset = posPtr->size(); posPtr->push_back(Vec3f(left, bottom, 0.f)); posPtr->push_back(Vec3f(right, bottom, 0.f)); posPtr->push_back(Vec3f(right, top, 0.f)); posPtr->push_back(Vec3f(left, top, 0.f)); indicesPtr->push_back(posOffset); indicesPtr->push_back(2); indicesPtr->push_back(posOffset + 1); indicesPtr->push_back(2); indicesPtr->push_back(posOffset + 2); indicesPtr->push_back(2); indicesPtr->push_back(posOffset + 3); indicesPtr->push_back(2); typesPtr->push_back(GL_LINE_STRIP); lensPtr->push_back(2); posOffset = posPtr->size(); if (layoutParam.horizontal == true) { Real32 base = top - face->getHoriAscent() * scale; posPtr->push_back(Vec3f(left, base, 0.f)); posPtr->push_back(Vec3f(right, base, 0.f)); } else { Real32 base = left - face->getVertAscent() * scale; posPtr->push_back(Vec3f(base, top, 0.f)); posPtr->push_back(Vec3f(base, bottom, 0.f)); } indicesPtr->push_back(posOffset); indicesPtr->push_back(2); indicesPtr->push_back(posOffset + 1); indicesPtr->push_back(2); pos += offset; } geoPtr->editMFIndexMapping()->clear(); geoPtr->editMFIndexMapping()->push_back(Geometry::MapPosition); geoPtr->editMFIndexMapping()->push_back(Geometry::MapColor); SimpleMaterialPtr matPtr = SimpleMaterial::create(); geoPtr->setMaterial(matPtr); } endEditCP(geoPtr); NodePtr nodePtr = Node::create(); beginEditCP(nodePtr, Node::CoreFieldMask); { nodePtr->setCore(geoPtr); } endEditCP(nodePtr, Node::CoreFieldMask); return nodePtr; }
NodePtr createRose() { GeometryPtr geoPtr = Geometry::create(); beginEditCP(geoPtr); { GeoPTypesUI8Ptr typesPtr = GeoPTypesUI8::create(); typesPtr->push_back(GL_QUADS); geoPtr->setTypes(typesPtr); GeoPLengthsUI32Ptr lensPtr = GeoPLengthsUI32::create(); lensPtr->push_back(96); geoPtr->setLengths(lensPtr); GeoPositions3fPtr posPtr = GeoPositions3f::create(); // top posPtr->push_back(Vec3f( 0.00f, 1.00f, 0.00f)); posPtr->push_back(Vec3f( 0.00f, 0.10f, 0.10f)); posPtr->push_back(Vec3f( 0.05f, 0.05f, 0.05f)); posPtr->push_back(Vec3f( 0.10f, 0.10f, 0.00f)); posPtr->push_back(Vec3f( 0.00f, 1.00f, 0.00f)); posPtr->push_back(Vec3f( 0.10f, 0.10f, 0.00f)); posPtr->push_back(Vec3f( 0.05f, 0.05f, -0.05f)); posPtr->push_back(Vec3f( 0.00f, 0.10f, -0.10f)); posPtr->push_back(Vec3f( 0.00f, 1.00f, 0.00f)); posPtr->push_back(Vec3f( 0.00f, 0.10f, -0.10f)); posPtr->push_back(Vec3f(-0.05f, 0.05f, -0.05f)); posPtr->push_back(Vec3f(-0.10f, 0.10f, 0.00f)); posPtr->push_back(Vec3f( 0.00f, 1.00f, 0.00f)); posPtr->push_back(Vec3f(-0.10f, 0.10f, 0.00f)); posPtr->push_back(Vec3f(-0.05f, 0.05f, 0.05f)); posPtr->push_back(Vec3f( 0.00f, 0.10f, 0.10f)); // bottom posPtr->push_back(Vec3f( 0.00f, -1.00f, 0.00f)); posPtr->push_back(Vec3f( 0.10f, -0.10f, 0.00f)); posPtr->push_back(Vec3f( 0.05f, -0.05f, 0.05f)); posPtr->push_back(Vec3f( 0.00f, -0.10f, 0.10f)); posPtr->push_back(Vec3f( 0.00f, -1.00f, 0.00f)); posPtr->push_back(Vec3f( 0.00f, -0.10f, 0.10f)); posPtr->push_back(Vec3f(-0.05f, -0.05f, 0.05f)); posPtr->push_back(Vec3f(-0.10f, -0.10f, 0.00f)); posPtr->push_back(Vec3f( 0.00f, -1.00f, 0.00f)); posPtr->push_back(Vec3f(-0.10f, -0.10f, 0.00f)); posPtr->push_back(Vec3f(-0.05f, -0.05f, -0.05f)); posPtr->push_back(Vec3f( 0.00f, -0.10f, -0.10f)); posPtr->push_back(Vec3f( 0.00f, -1.00f, 0.00f)); posPtr->push_back(Vec3f( 0.00f, -0.10f, -0.10f)); posPtr->push_back(Vec3f( 0.05f, -0.05f, -0.05f)); posPtr->push_back(Vec3f( 0.10f, -0.10f, 0.00f)); // left posPtr->push_back(Vec3f(-1.00f, 0.00f, 0.00f)); posPtr->push_back(Vec3f(-0.10f, -0.10f, 0.00f)); posPtr->push_back(Vec3f(-0.05f, -0.05f, 0.05f)); posPtr->push_back(Vec3f(-0.10f, 0.00f, 0.10f)); posPtr->push_back(Vec3f(-1.00f, 0.00f, 0.00f)); posPtr->push_back(Vec3f(-0.10f, 0.00f, 0.10f)); posPtr->push_back(Vec3f(-0.05f, 0.05f, 0.05f)); posPtr->push_back(Vec3f(-0.10f, 0.10f, 0.00f)); posPtr->push_back(Vec3f(-1.00f, 0.00f, 0.00f)); posPtr->push_back(Vec3f(-0.10f, 0.10f, 0.00f)); posPtr->push_back(Vec3f(-0.05f, 0.05f, -0.05f)); posPtr->push_back(Vec3f(-0.10f, 0.00f, -0.10f)); posPtr->push_back(Vec3f(-1.00f, 0.00f, 0.00f)); posPtr->push_back(Vec3f(-0.10f, 0.00f, -0.10f)); posPtr->push_back(Vec3f(-0.05f, -0.05f, -0.05f)); posPtr->push_back(Vec3f(-0.10f, -0.10f, 0.00f)); // right posPtr->push_back(Vec3f( 1.00f, 0.00f, 0.00f)); posPtr->push_back(Vec3f( 0.10f, 0.00f, 0.10f)); posPtr->push_back(Vec3f( 0.05f, -0.05f, 0.05f)); posPtr->push_back(Vec3f( 0.10f, -0.10f, 0.00f)); posPtr->push_back(Vec3f( 1.00f, 0.00f, 0.00f)); posPtr->push_back(Vec3f( 0.10f, -0.10f, 0.00f)); posPtr->push_back(Vec3f( 0.05f, -0.05f, -0.05f)); posPtr->push_back(Vec3f( 0.10f, 0.00f, -0.10f)); posPtr->push_back(Vec3f( 1.00f, 0.00f, 0.00f)); posPtr->push_back(Vec3f( 0.10f, 0.00f, -0.10f)); posPtr->push_back(Vec3f( 0.05f, 0.05f, -0.05f)); posPtr->push_back(Vec3f( 0.10f, 0.10f, 0.00f)); posPtr->push_back(Vec3f( 1.00f, 0.00f, 0.00f)); posPtr->push_back(Vec3f( 0.10f, 0.10f, 0.00f)); posPtr->push_back(Vec3f( 0.05f, 0.05f, 0.05f)); posPtr->push_back(Vec3f( 0.10f, 0.00f, 0.10f)); // front posPtr->push_back(Vec3f( 0.00f, 0.00f, 1.00f)); posPtr->push_back(Vec3f( 0.10f, 0.00f, 0.10f)); posPtr->push_back(Vec3f( 0.05f, 0.05f, 0.05f)); posPtr->push_back(Vec3f( 0.00f, 0.10f, 0.10f)); posPtr->push_back(Vec3f( 0.00f, 0.00f, 1.00f)); posPtr->push_back(Vec3f( 0.00f, 0.10f, 0.10f)); posPtr->push_back(Vec3f(-0.05f, 0.05f, 0.05f)); posPtr->push_back(Vec3f(-0.10f, 0.00f, 0.10f)); posPtr->push_back(Vec3f( 0.00f, 0.00f, 1.00f)); posPtr->push_back(Vec3f(-0.10f, 0.00f, 0.10f)); posPtr->push_back(Vec3f(-0.05f, -0.05f, 0.05f)); posPtr->push_back(Vec3f( 0.00f, -0.10f, 0.10f)); posPtr->push_back(Vec3f( 0.00f, 0.00f, 1.00f)); posPtr->push_back(Vec3f( 0.00f, -0.10f, 0.10f)); posPtr->push_back(Vec3f( 0.05f, -0.05f, 0.05f)); posPtr->push_back(Vec3f( 0.10f, 0.00f, 0.10f)); // back posPtr->push_back(Vec3f( 0.00f, 0.00f, -1.00f)); posPtr->push_back(Vec3f(-0.10f, 0.00f, -0.10f)); posPtr->push_back(Vec3f(-0.05f, 0.05f, -0.05f)); posPtr->push_back(Vec3f( 0.00f, 0.10f, -0.10f)); posPtr->push_back(Vec3f( 0.00f, 0.00f, -1.00f)); posPtr->push_back(Vec3f( 0.00f, 0.10f, -0.10f)); posPtr->push_back(Vec3f( 0.05f, 0.05f, -0.05f)); posPtr->push_back(Vec3f( 0.10f, 0.00f, -0.10f)); posPtr->push_back(Vec3f( 0.00f, 0.00f, -1.00f)); posPtr->push_back(Vec3f( 0.10f, 0.00f, -0.10f)); posPtr->push_back(Vec3f( 0.05f, -0.05f, -0.05f)); posPtr->push_back(Vec3f( 0.00f, -0.10f, -0.10f)); posPtr->push_back(Vec3f( 0.00f, 0.00f, -1.00f)); posPtr->push_back(Vec3f( 0.00f, -0.10f, -0.10f)); posPtr->push_back(Vec3f(-0.05f, -0.05f, -0.05f)); posPtr->push_back(Vec3f(-0.10f, 0.00f, -0.10f)); geoPtr->setPositions(posPtr); SimpleMaterialPtr matPtr = SimpleMaterial::create(); beginEditCP(matPtr); { matPtr->setDiffuse(Color3f(1, 0, 0)); } endEditCP(matPtr); geoPtr->setMaterial(matPtr); } endEditCP(geoPtr); calcFaceNormals(geoPtr); NodePtr nodePtr = Node::create(); beginEditCP(nodePtr, Node::CoreFieldMask); { nodePtr->setCore(geoPtr); } endEditCP(nodePtr, Node::CoreFieldMask); return nodePtr; }