Exemplo n.º 1
0
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]);
  }
}
Exemplo n.º 2
0
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();
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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);
            }
        }
    }
}
Exemplo n.º 5
0
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;
}
Exemplo n.º 6
0
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;
}