Action::ResultE
CPUSkinningAlgorithm::intersectEnter(Action *action)
{
    Action::ResultE  res     = Action::Continue;
    SkinnedGeometry *skinGeo = getSkin    ();
    Skeleton        *skel    = getSkeleton();
    IntersectAction *iact    =
        boost::polymorphic_downcast<IntersectAction *>(action);

    CPUSkinningDataAttachmentUnrecPtr data = getCPUSkinningData(skinGeo);

    if(data == NULL)
    {
        data = CPUSkinningDataAttachment::create();
        skinGeo->addAttachment(data);
    }

    skel->intersectEnter(action, skinGeo);

    if(data->getDataValid() == false)
    {
        transformGeometry(skinGeo, skel, data);

        data->setDataValid(true);
    }

    intersectGeometry(iact, skinGeo, data);

    return res;
}
    void operator()(ResourceDatabase* db)
    {
      if (stripfy())
        setRemoveDoubles(true);

      std::vector< vl::ref<vl::Geometry> > geom;
      db->get<Geometry>(geom);
      for(unsigned int i=0; i<geom.size(); ++i)
      {
        if (discardOriginalNormals())
          geom[i]->setNormalArray(NULL);

        if (computeNormals() && !geom[i]->normalArray())
          geom[i]->computeNormals();

        if (removeDoubles())
          DoubleVertexRemover().removeDoubles(geom[i].get());

        if (sortVertices())
          geom[i]->sortVertices();

        if (stripfy())
          TriangleStripGenerator().stripfy(geom[i].get(), 22, true, false, true);

        if (convertToDrawArrays())
          geom[i]->convertDrawCallToDrawArrays();

        geom[i]->setDisplayListEnabled(useDisplayLists());
        geom[i]->setVBOEnabled(useVBOs());

        if (transformGeometry())
          geom[i]->transform(transformMatrix(),true);
      }
    }
Action::ResultE
CPUSkinningAlgorithm::renderEnter(Action *action)
{
    Action::ResultE  res     = Action::Continue;
    SkinnedGeometry *skinGeo = getSkin    ();
    Skeleton        *skel    = getSkeleton();
    RenderAction    *ract    =
        boost::polymorphic_downcast<RenderAction *>(action); 

    OSG_ASSERT(skinGeo != NULL);
    OSG_ASSERT(skel    != NULL);

    CPUSkinningDataAttachmentUnrecPtr data = getCPUSkinningData(skinGeo);

    if(data == NULL)
    {
        data = CPUSkinningDataAttachment::create();
        skinGeo->addAttachment(data);
    }

    skel->renderEnter(action, skinGeo);

    if(data->getDataValid() == false)
    {
        transformGeometry(skinGeo, skel, data);

        data->setDataValid(true);
    }

    renderGeometry(ract, skinGeo, data);

    return res;
}
예제 #4
0
void LuxRenderer::defineGeometry()
{
	for( size_t i = 0; i < this->mtlu_scene->objectList.size(); i++)
	{
		mtlu_MayaObject *obj = (mtlu_MayaObject *)this->mtlu_scene->objectList[i];
		if( obj->visible )
		{
			if( obj->mobject.hasFn(MFn::kMesh))
			{
				if( isLightMesh(obj))
				{
					logger.debug(MString("Mesh: "));
				}
				if( obj->instanceNumber == 0)
				{
					logger.debug(MString("define mesh ") + obj->fullNiceName);

					//ParamSet triParams = CreateParamSet();
					//float r = 0.3;
					//triParams->AddFloat("radius", &r);
					//this->lux->objectBegin(obj->fullNiceName.asChar());
					//this->lux->shape("sphere", boost::get_pointer(triParams));
					//this->lux->objectEnd();

					if( this->mtlu_renderGlobals->exportSceneFile)
					{
						float r = 0.3;
						this->luxFile << "ObjectBegin \"" << obj->fullNiceName.asChar() << "\"\n";
						this->luxFile << "Shape \"sphere\" \"float radius\" [" << r << "]\n";
						this->luxFile << "ObjectEnd\n";
					}
					this->defineTriangleMesh(obj);
				}

				bool doMotionblur = this->mtlu_renderGlobals->doMb && (obj->motionBlurred) && (obj->transformMatrices.size() > 1);
				transformGeometry(obj, doMotionblur);
			}
		}
	}
}