// 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; }
bool VerifyGraphOp::verifyIndexMap(GeometryPtr &geo, bool &repair) { repair = false; if(geo == NullFC) return true; if(geo->getIndices() == NullFC) return true; if(!geo->getMFIndexMapping()->empty()) return true; if(geo->getPositions() == NullFC) return true; UInt32 positions_size = geo->getPositions()->getSize(); UInt32 normals_size = 0; if(geo->getNormals() != NullFC) normals_size = geo->getNormals()->getSize(); UInt32 colors_size = 0; if(geo->getColors() != NullFC) colors_size = geo->getColors()->getSize(); UInt32 secondary_colors_size = 0; if(geo->getSecondaryColors() != NullFC) secondary_colors_size = geo->getSecondaryColors()->getSize(); UInt32 texccords_size = 0; if(geo->getTexCoords() != NullFC) texccords_size = geo->getTexCoords()->getSize(); UInt32 texccords1_size = 0; if(geo->getTexCoords1() != NullFC) texccords1_size = geo->getTexCoords1()->getSize(); UInt32 texccords2_size = 0; if(geo->getTexCoords2() != NullFC) texccords2_size = geo->getTexCoords2()->getSize(); UInt32 texccords3_size = 0; if(geo->getTexCoords3() != NullFC) texccords3_size = geo->getTexCoords3()->getSize(); /* printf("sizes: %u %u %u %u %u %u %u %u\n", positions_size, normals_size, colors_size, secondary_colors_size, texccords_size, texccords1_size, texccords2_size, texccords3_size); */ if((positions_size == normals_size || normals_size == 0) && (positions_size == colors_size || colors_size == 0) && (positions_size == secondary_colors_size || secondary_colors_size == 0) && (positions_size == texccords_size || texccords_size == 0) && (positions_size == texccords1_size || texccords1_size == 0) && (positions_size == texccords2_size || texccords2_size == 0) && (positions_size == texccords3_size || texccords3_size == 0) ) { UInt16 indexmap = 0; if(positions_size > 0) indexmap |= Geometry::MapPosition; if(normals_size > 0) indexmap |= Geometry::MapNormal; if(colors_size > 0) indexmap |= Geometry::MapColor; if(secondary_colors_size > 0) indexmap |= Geometry::MapSecondaryColor; if(texccords_size > 0) indexmap |= Geometry::MapTexCoords; if(texccords1_size > 0) indexmap |= Geometry::MapTexCoords1; if(texccords2_size > 0) indexmap |= Geometry::MapTexCoords2; if(texccords3_size > 0) indexmap |= Geometry::MapTexCoords3; beginEditCP(geo, Geometry::IndexMappingFieldMask); geo->editMFIndexMapping()->push_back(indexmap); endEditCP(geo, Geometry::IndexMappingFieldMask); repair = true; return false; } else { return false; } }
// 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; }