TriangleMesh::TriangleMesh(domTrianglesRef triangles) { const domInputLocalOffset_Array trianglesInputArray = triangles->getInput_array(); size_t vertexOffset, normalOffset; for (size_t m = 0; m < trianglesInputArray.getCount(); m++) { const domInputLocalOffsetRef trianglesInput = trianglesInputArray[m]; const xsNMTOKEN trianglesInputSemantic = trianglesInput->getSemantic(); if (!strcmp(trianglesInputSemantic, "VERTEX")) { const domVerticesRef src = daeSafeCast<domVertices>(trianglesInput->getSource().getElement()); const domInputLocal_Array verticesInputArray = src->getInput_array(); for (size_t n = 0; n < verticesInputArray.getCount(); n++) { const domInputLocalRef verticesInput = verticesInputArray[n]; const xsNMTOKEN verticesInputSemantic = verticesInput->getSemantic(); if (!strcmp(verticesInputSemantic, "POSITION")) { const domSourceRef src = daeSafeCast<domSource>(verticesInput->getSource().getElement()); parseCoordinateSource(&posArray, src, 1.f); } } vertexOffset = trianglesInput->getOffset(); } else if (!strcmp(trianglesInputSemantic, "NORMAL")) { const domSourceRef src = daeSafeCast<domSource>(trianglesInput->getSource().getElement()); parseCoordinateSource(&normalArray, src, 0.f); normalOffset = trianglesInput->getOffset(); } } const domListOfUInts origInds = triangles->getP()->getValue(); for (int i = 0; i < 3*triangles->getCount(); i++) { inds.append(origInds[i*trianglesInputArray.getCount()+vertexOffset]); inds.append(origInds[i*trianglesInputArray.getCount()+normalOffset]); } }
TriangleMesh::TriangleMesh(domTrianglesRef triangles, const char *desiredEffect) : effect(desiredEffect) { const domInputLocalOffset_Array trianglesInputArray = triangles->getInput_array(); size_t vertexOffset, normalOffset, texcoordOffset, colorOffset; bool foundtexcoord = false, foundcolor = false; for (size_t m = 0; m < trianglesInputArray.getCount(); m++) { const domInputLocalOffsetRef trianglesInput = trianglesInputArray[m]; const xsNMTOKEN trianglesInputSemantic = trianglesInput->getSemantic(); if (!strcmp(trianglesInputSemantic, "VERTEX")) { const domVerticesRef src = daeSafeCast<domVertices>(trianglesInput->getSource().getElement()); const domInputLocal_Array verticesInputArray = src->getInput_array(); for (size_t n = 0; n < verticesInputArray.getCount(); n++) { const domInputLocalRef verticesInput = verticesInputArray[n]; const xsNMTOKEN verticesInputSemantic = verticesInput->getSemantic(); if (!strcmp(verticesInputSemantic, "POSITION")) { const domSourceRef src = daeSafeCast<domSource>(verticesInput->getSource().getElement()); parseCoordinateSource(&posArray, src); } } vertexOffset = trianglesInput->getOffset(); } else if (!strcmp(trianglesInputSemantic, "NORMAL")) { const domSourceRef src = daeSafeCast<domSource>(trianglesInput->getSource().getElement()); parseCoordinateSource(&normalArray, src); normalOffset = trianglesInput->getOffset(); } else if (!strcmp(trianglesInputSemantic, "TEXCOORD")) { const domSourceRef src = daeSafeCast<domSource>(trianglesInput->getSource().getElement()); parseTexcoordSource(&texcoordArray, src); texcoordOffset = trianglesInput->getOffset(); foundtexcoord = true; } else if (!strcmp(trianglesInputSemantic, "COLOR")) { const domSourceRef src = daeSafeCast<domSource>(trianglesInput->getSource().getElement()); parseColorSource(&colorArray, src); colorOffset = trianglesInput->getOffset(); foundcolor = true; } } if (!foundtexcoord) texcoordArray.append2(0.f, 0.f); if (!foundcolor) colorArray.append4(1.f, 1.f, 1.f, 1.f); const domListOfUInts origInds = triangles->getP()->getValue(); for (int i = 0; i < 3*triangles->getCount(); i++) { inds.append(origInds[i*trianglesInputArray.getCount()+vertexOffset]); inds.append(origInds[i*trianglesInputArray.getCount()+normalOffset]); inds.append(foundtexcoord ? origInds[i*trianglesInputArray.getCount()+texcoordOffset] : 0); inds.append(foundcolor ? origInds[i*trianglesInputArray.getCount()+colorOffset] : 0); } material = triangles->getMaterial(); }
IZ_BOOL CColladaAnimation::GetInterpType( domInputLocalRef pInput, SAnmChannel& sAnmChannel) { domSource* pSrc = (domSource*)((domElement*)pInput->getSource().getElement()); VRETURN(pSrc != IZ_NULL); domUint num = pSrc->getName_array()->getCount(); izanagi::E_ANM_INTERP_TYPE nInterp = izanagi::E_ANM_INTERP_TYPE_NUM; for (domUint i = 0; i < num; i++) { daeString name = pSrc->getName_array()->getValue().get((size_t)i); if (izanagi::tool::CString::CmpStr(name, "BEZIER")) { // NOTE // I think collada bezier parameters are for hermite not bezier... nInterp = izanagi::E_ANM_INTERP_TYPE_HERMITE; } else { // TODO VRETURN(IZ_FALSE); } if (i > 0) { // Interpolation must be same. VRETURN(sAnmChannel.interp == nInterp); } sAnmChannel.interp = nInterp; } return IZ_TRUE; }
void getJointNames(const domSkin* skin, std::vector<std::string>& list) { const domSkin::domJointsRef& joints = skin->getJoints(); const domInputLocal_Array& inputArray = joints->getInput_array(); size_t inputCount = inputArray.getCount(); for (size_t i = 0; i < inputCount; ++i) { const domInputLocalRef input = inputArray.get(i); const char* semantic = input->getSemantic(); if (strcmp(semantic, "JOINT") == 0) { daeElement* sourceElement = input->getSource().getElement(); if (sourceElement) { const domSourceRef source = daeSafeCast<domSource>(sourceElement); getJointNames(source, list); } } } }
IZ_BOOL CColladaAnimation::GetAnmInputParams( domInputLocalRef pInput, const SAnmChannel& sAnmChannel, SAnmInput& sAnmInput) { domSource* pSrc = (domSource*)((domElement*)pInput->getSource().getElement()); VRETURN(pSrc != IZ_NULL); if (sAnmInput.semantic == E_INPUT_SEMANTIC_INPUT) { // Stride must be 1. sAnmInput.stride = (IZ_UINT)pSrc->getTechnique_common()->getAccessor()->getStride(); VRETURN(sAnmInput.stride == 1); // Input parmeter means "TIME". domUint nParamCnt = pSrc->getTechnique_common()->getAccessor()->getParam_array().getCount(); VRETURN(nParamCnt == 1); domParamRef pParam = pSrc->getTechnique_common()->getAccessor()->getParam_array().get(0); daeString name = pParam->getName(); VRETURN(izanagi::tool::CString::CmpStr(name, "TIME")); domUint num = pSrc->getFloat_array()->getCount(); for (size_t i = 0; i < num; i++) { IZ_FLOAT time = (IZ_FLOAT)pSrc->getFloat_array()->getValue().get(i); sAnmInput.params.push_back(time); } } else if ((sAnmInput.semantic == E_INPUT_SEMANTIC_OUTPUT) || (sAnmInput.semantic == E_INPUT_SEMANTIC_IN_TANGENT) || (sAnmInput.semantic == E_INPUT_SEMANTIC_OUT_TANGENT)) { domUint nStride = pSrc->getTechnique_common()->getAccessor()->getStride(); // TODO // Check paramater stride size is valid. // ex) translate -> 3 / rotate -> 1 / scale -> 3 etc... IZ_ASSERT(_GetStride(sAnmChannel.type) == nStride); IZ_UINT num = static_cast<IZ_UINT>(pSrc->getFloat_array()->getCount()); for (IZ_UINT i = 0; i < num; i++) { IZ_FLOAT val = (IZ_FLOAT)pSrc->getFloat_array()->getValue().get(i); sAnmInput.params.push_back(val); } sAnmInput.stride = (IZ_UINT)nStride; } return IZ_TRUE; }
const domSourceRef getSource(const domInputLocalRef& inputLocal, const domAnimationRef& animation) { const domURIFragmentType& uri = inputLocal->getSource(); daeElementRef element = uri.getElement(); if (element && element->typeID() == COLLADA_TYPE::SAMPLER) { const domSourceRef source = daeSafeCast<domSource>(element); return source; } // Resolve the URI by searching through the animation's list of sources const std::string& id = uri.id(); const domSource_Array& sourceArray = animation->getSource_array(); size_t count = sourceArray.getCount(); for (size_t i = 0; i < count; ++i) { const domSourceRef source = sourceArray.get(i); if (id.compare(source->getId()) == 0) { return source; } } return NULL; }