JSONObject* WriteVisitor::createJSONRigGeometry(osgAnimation::RigGeometry* rigGeometry) { //TODO : Convert data to JSONVertexArray "Float32Array" osg::ref_ptr<JSONObject> json = new JSONObject; json->addUniqueID(); osg::ref_ptr<JSONObject> sourceGeometry = new JSONObject; if(osgAnimation::MorphGeometry *morphGeometry = dynamic_cast<osgAnimation::MorphGeometry*>(rigGeometry->getSourceGeometry())) { sourceGeometry->getMaps()["osgAnimation.MorphGeometry"] = createJSONMorphGeometry(morphGeometry, rigGeometry); } else { osg::Geometry *geometry = dynamic_cast<osg::Geometry*>(rigGeometry->getSourceGeometry()); if(geometry) { sourceGeometry->getMaps()["osg.Geometry"] = createJSONGeometry(geometry, rigGeometry); } } json->getMaps()["SourceGeometry"] = sourceGeometry.get(); osg::Array* bones = getAnimationBonesArray(*rigGeometry); osg::Array* weights = getAnimationWeightsArray(*rigGeometry); if (bones && weights) { json->getMaps()["BoneMap"] = buildRigBoneMap(*rigGeometry); json->getMaps()["VertexAttributeList"] = new JSONObject; osg::ref_ptr<JSONObject> attributes = json->getMaps()["VertexAttributeList"]; int nbVertexes = rigGeometry->getSourceGeometry()->getVertexArray()->getNumElements(); attributes->getMaps()["Bones"] = createJSONBufferArray(bones, rigGeometry); attributes->getMaps()["Weights"] = createJSONBufferArray(weights, rigGeometry); int nb = bones->getNumElements(); if (nbVertexes != nb) { osg::notify(osg::FATAL) << "Fatal nb bones " << nb << " != " << nbVertexes << std::endl; error(); } nb = weights->getNumElements(); if (nbVertexes != nb) { osg::notify(osg::FATAL) << "Fatal nb weights " << nb << " != " << nbVertexes << std::endl; error(); } } return json.release(); }
JSONObject* WriteVisitor::createJSONGeometry(osg::Geometry* geom) { if (_maps.find(geom) != _maps.end()) return _maps[geom]->getShadowObject(); if (needToSplit(*geom)) error(); osg::ref_ptr<JSONObject> json = new JSONNode; json->addUniqueID(); _maps[geom] = json; if (geom->getStateSet()) createJSONStateSet(json, geom->getStateSet()); translateObject(json.get(), geom); osg::ref_ptr<JSONObject> attributes = new JSONObject; int nbVertexes = geom->getVertexArray()->getNumElements(); if (geom->getVertexArray()) { attributes->getMaps()["Vertex"] = createJSONBufferArray(geom->getVertexArray()); } if (geom->getNormalArray()) { attributes->getMaps()["Normal"] = createJSONBufferArray(geom->getNormalArray()); int nb = geom->getNormalArray()->getNumElements(); if (nbVertexes != nb) { osg::notify(osg::FATAL) << "Fatal nb normals " << nb << " != " << nbVertexes << std::endl; error(); } } if (geom->getColorArray()) { attributes->getMaps()["Color"] = createJSONBufferArray(geom->getColorArray()); int nb = geom->getColorArray()->getNumElements(); if (nbVertexes != nb) { osg::notify(osg::FATAL) << "Fatal nb colors " << nb << " != " << nbVertexes << std::endl; error(); } } std::stringstream ss; for ( int i = 0; i < 32; i++) { ss.str(""); ss << "TexCoord" << i; //osg::notify(osg::NOTICE) << ss.str() << std::endl; if (geom->getTexCoordArray(i)) { attributes->getMaps()[ss.str()] = createJSONBufferArray(geom->getTexCoordArray(i)); int nb = geom->getTexCoordArray(i)->getNumElements(); if (nbVertexes != nb) { osg::notify(osg::FATAL) << "Fatal nb tex coord " << i << " " << nb << " != " << nbVertexes << std::endl; error(); } } } if (geom->getVertexAttribArray(TANGENT_ATTRIBUTE_INDEX)) { attributes->getMaps()["Tangent"] = createJSONBufferArray(geom->getVertexAttribArray(TANGENT_ATTRIBUTE_INDEX)); int nb = geom->getVertexAttribArray(TANGENT_ATTRIBUTE_INDEX)->getNumElements(); if (nbVertexes != nb) { osg::notify(osg::FATAL) << "Fatal nb tangent " << nb << " != " << nbVertexes << std::endl; error(); } } if (geom->getVertexAttribArray(BITANGENT_ATTRIBUTE_INDEX)) { attributes->getMaps()["Bitangent"] = createJSONBufferArray(geom->getVertexAttribArray(BITANGENT_ATTRIBUTE_INDEX)); int nb = geom->getVertexAttribArray(BITANGENT_ATTRIBUTE_INDEX)->getNumElements(); if (nbVertexes != nb) { osg::notify(osg::FATAL) << "Fatal nb bitangent " << nb << " != " << nbVertexes << std::endl; error(); } } json->getMaps()["VertexAttributeList"] = attributes; if (!geom->getPrimitiveSetList().empty()) { osg::ref_ptr<JSONArray> primitives = new JSONArray(); for (unsigned int i = 0; i < geom->getPrimitiveSetList().size(); ++i) { osg::ref_ptr<JSONObject> obj = new JSONObject; if (geom->getPrimitiveSetList()[i]->getType() == osg::PrimitiveSet::DrawArraysPrimitiveType) { osg::DrawArrays* da = dynamic_cast<osg::DrawArrays*>((geom->getPrimitiveSetList()[i].get())); primitives->getArray().push_back(obj); if (da->getMode() == GL_QUADS) { obj->getMaps()["DrawElementsUShort"] = createJSONDrawElements(da); } else { obj->getMaps()["DrawArrays"] = createJSONDrawArray(da); } } else if (geom->getPrimitiveSetList()[i]->getType() == osg::PrimitiveSet::DrawElementsUIntPrimitiveType) { osg::DrawElementsUInt* da = dynamic_cast<osg::DrawElementsUInt*>((geom->getPrimitiveSetList()[i].get())); primitives->getArray().push_back(obj); obj->getMaps()["DrawElementsUShort"] = createJSONDrawElementsUInt(da); } else if (geom->getPrimitiveSetList()[i]->getType() == osg::PrimitiveSet::DrawElementsUShortPrimitiveType) { osg::DrawElementsUShort* da = dynamic_cast<osg::DrawElementsUShort*>((geom->getPrimitiveSetList()[i].get())); primitives->getArray().push_back(obj); obj->getMaps()["DrawElementsUShort"] = createJSONDrawElementsUShort(da); } else if (geom->getPrimitiveSetList()[i]->getType() == osg::PrimitiveSet::DrawElementsUBytePrimitiveType) { osg::DrawElementsUByte* da = dynamic_cast<osg::DrawElementsUByte*>((geom->getPrimitiveSetList()[i].get())); primitives->getArray().push_back(obj); obj->getMaps()["DrawElementsUShort"] = createJSONDrawElementsUByte(da); } else if (geom->getPrimitiveSetList()[i]->getType() == osg::PrimitiveSet::DrawArrayLengthsPrimitiveType) { osg::DrawArrayLengths* dal = dynamic_cast<osg::DrawArrayLengths*>((geom->getPrimitiveSetList()[i].get())); primitives->getArray().push_back(obj); obj->getMaps()["DrawArrayLengths"] = createJSONDrawArrayLengths(dal); } else { osg::notify(osg::WARN) << "Primitive Type " << geom->getPrimitiveSetList()[i]->getType() << " not supported, skipping" << std::endl; } } json->getMaps()["PrimitiveSetList"] = primitives; } return json; }
JSONObject* WriteVisitor::createJSONGeometry(osg::Geometry* geometry, osg::Object* parent) { if(!parent) { parent = geometry; } if (_maps.find(geometry) != _maps.end()) return _maps[geometry]->getShadowObject(); osg::ref_ptr<JSONObject> json = new JSONObject; json->addUniqueID(); _maps[geometry] = json; if (geometry->getStateSet()) createJSONStateSet(json.get(), geometry->getStateSet()); translateObject(json.get(), geometry); osg::ref_ptr<JSONObject> attributes = new JSONObject; int nbVertexes = 0; if (geometry->getVertexArray()) { nbVertexes = geometry->getVertexArray()->getNumElements(); attributes->getMaps()["Vertex"] = createJSONBufferArray(geometry->getVertexArray(), parent); } if (geometry->getNormalArray()) { attributes->getMaps()["Normal"] = createJSONBufferArray(geometry->getNormalArray(), parent); int nb = geometry->getNormalArray()->getNumElements(); if (nbVertexes != nb) { osg::notify(osg::FATAL) << "Fatal nb normals " << nb << " != " << nbVertexes << std::endl; error(); } } if (geometry->getColorArray()) { attributes->getMaps()["Color"] = createJSONBufferArray(geometry->getColorArray(), parent); int nb = geometry->getColorArray()->getNumElements(); if (nbVertexes != nb) { osg::notify(osg::FATAL) << "Fatal nb colors " << nb << " != " << nbVertexes << std::endl; error(); } } std::stringstream ss; for ( int i = 0; i < 32; i++) { ss.str(""); ss << "TexCoord" << i; //osg::notify(osg::NOTICE) << ss.str() << std::endl; if (geometry->getTexCoordArray(i)) { attributes->getMaps()[ss.str()] = createJSONBufferArray(geometry->getTexCoordArray(i), parent); int nb = geometry->getTexCoordArray(i)->getNumElements(); if (nbVertexes != nb) { osg::notify(osg::FATAL) << "Fatal nb tex coord " << i << " " << nb << " != " << nbVertexes << std::endl; error(); } } } osg::Array* tangents = getTangentSpaceArray(*geometry); if (tangents) { attributes->getMaps()["Tangent"] = createJSONBufferArray(tangents, parent); int nb = tangents->getNumElements(); if (nbVertexes != nb) { osg::notify(osg::FATAL) << "Fatal nb tangent " << nb << " != " << nbVertexes << std::endl; error(); } } json->getMaps()["VertexAttributeList"] = attributes; if (!geometry->getPrimitiveSetList().empty()) { osg::ref_ptr<JSONArray> primitives = new JSONArray(); for (unsigned int i = 0; i < geometry->getNumPrimitiveSets(); ++i) { osg::ref_ptr<JSONObject> obj = new JSONObject; osg::PrimitiveSet* primitive = geometry->getPrimitiveSet(i); if(!primitive) continue; if (primitive->getType() == osg::PrimitiveSet::DrawArraysPrimitiveType) { osg::DrawArrays* da = dynamic_cast<osg::DrawArrays*>((primitive)); primitives->getArray().push_back(obj); if (da->getMode() == GL_QUADS) { obj->getMaps()["DrawElementsUShort"] = createJSONDrawElements(da, parent); } else { obj->getMaps()["DrawArrays"] = createJSONDrawArray(da, parent); } } else if (primitive->getType() == osg::PrimitiveSet::DrawElementsUIntPrimitiveType) { osg::DrawElementsUInt* da = dynamic_cast<osg::DrawElementsUInt*>((primitive)); primitives->getArray().push_back(obj); obj->getMaps()["DrawElementsUInt"] = createJSONDrawElementsUInt(da, parent); } else if (primitive->getType() == osg::PrimitiveSet::DrawElementsUShortPrimitiveType) { osg::DrawElementsUShort* da = dynamic_cast<osg::DrawElementsUShort*>((primitive)); primitives->getArray().push_back(obj); obj->getMaps()["DrawElementsUShort"] = createJSONDrawElementsUShort(da, parent); } else if (primitive->getType() == osg::PrimitiveSet::DrawElementsUBytePrimitiveType) { osg::DrawElementsUByte* da = dynamic_cast<osg::DrawElementsUByte*>((primitive)); primitives->getArray().push_back(obj); obj->getMaps()["DrawElementsUByte"] = createJSONDrawElementsUByte(da, parent); } else if (primitive->getType() == osg::PrimitiveSet::DrawArrayLengthsPrimitiveType) { osg::DrawArrayLengths* dal = dynamic_cast<osg::DrawArrayLengths*>((primitive)); primitives->getArray().push_back(obj); obj->getMaps()["DrawArrayLengths"] = createJSONDrawArrayLengths(dal, parent); } else { osg::notify(osg::WARN) << "Primitive Type " << geometry->getPrimitiveSetList()[i]->getType() << " not supported, skipping" << std::endl; } } json->getMaps()["PrimitiveSetList"] = primitives; } if (geometry->getComputeBoundingBoxCallback()) { osg::ref_ptr<JSONObject> jsonObj = new JSONObject; jsonObj->addUniqueID(); json->getMaps()["osg.ComputeBoundingBoxCallback"] = jsonObj; } return json.get(); }