コード例 #1
0
SE_Vector3f SE_SimObject::localToWorld(const SE_Vector3f& v)
{
    SE_Spatial* spatial = getSpatial();
    SE_Matrix4f worldTransform = spatial->getWorldTransform();
    SE_Vector4f v4(v, 1);
    v4 = worldTransform.mul(getLocalMatrix()).map(v4);
    return v4.xyz();
}
コード例 #2
0
ファイル: SE_MeshSimObject.cpp プロジェクト: wljcom/3DHomeHD
SE_SimObject::RenderUnitVector SE_MeshSimObject::createUnitForTarget(RENDERTARGET_TYPE type,SE_RenderTarget* rt)
{
    RenderUnitVector ruv;

    int surfaceNum = this->getSurfaceNum();

    if(type == MIRROR)
    {
        for(int i = 0; i < surfaceNum; ++i)
        {

            SE_Surface* surface = getMesh()->getSurface(i);
            SE_TriSurfaceRenderUnit* tsru = new SE_TriSurfaceRenderUnit(surface);


            std::string indexStr = SE_Util::intToString(i);
            std::string spatialName = this->getSpatial()->getSpatialName();
            std::string renderUnitName = spatialName + "_" + indexStr;

            tsru->setLayer(*getSpatial()->getWorldLayer());

            tsru->setEnableCullFace(false);

            tsru->setName(renderUnitName.c_str());

            tsru->setPrimitiveType(getPrimitiveType());

            tsru->setRenderableSpatial(this->getSpatial());

            if(!isUseWorldMatrix())
            {
                tsru->setWorldTransform(getSpatial()->getWorldTransform().mul(getLocalMatrix()));
            }
            else
            {
                tsru->setWorldTransform(getWorldMatrix());
            }

            for(int j = 0 ; j < RENDERSTATE_NUM ; j++)
            {
                tsru->setRenderState((RENDER_STATE_TYPE)j, getSpatial()->getRenderState((RENDER_STATE_TYPE)j), NOT_OWN);
            }

            tsru->setBlendState(this->getSpatial()->isSpatialEffectHasAttribute(SE_SpatialAttribute::BLENDABLE));
            //render fbo no need alpha effect;
            tsru->setAlpha(1.0);

            //need render mirror
            tsru->setNeedGenerateMirror(true);
            tsru->setShaderName(DRAWMIRROR_SHADER);
            tsru->setRenderName(DRAWMIRROR_RENDERER);

            //tsru->setRenderToFbo(true);

            /*SE_Spatial* mirrorobj = this->getSpatial()->getMirrorObject();
                        if(mirrorobj)
                        {
                            tsru->setMirrorObject(mirrorobj);
            }*/

            tsru->setMirrorPlan(this->getSpatial()->getMirrorPlan());

            tsru->setRenderTarget(rt);

            ruv.push_back(tsru);
        }
    }

    if(type == SHADOW)
    {
        for(int i = 0; i < surfaceNum; ++i)
        {

            SE_Surface* surface = getMesh()->getSurface(i);
            SE_TriSurfaceRenderUnit* tsru = new SE_TriSurfaceRenderUnit(surface);


            std::string indexStr = SE_Util::intToString(i);
            std::string spatialName = this->getSpatial()->getSpatialName();
            std::string renderUnitName = spatialName + "_" + indexStr;

            tsru->setLayer(*getSpatial()->getWorldLayer());

            tsru->setEnableCullFace(false);

            tsru->setName(renderUnitName.c_str());

            tsru->setPrimitiveType(getPrimitiveType());

            tsru->setRenderableSpatial(this->getSpatial());

            if(!isUseWorldMatrix())
            {
                tsru->setWorldTransform(getSpatial()->getWorldTransform().mul(getLocalMatrix()));
            }
            else
            {
                tsru->setWorldTransform(getWorldMatrix());
            }

            for(int j = 0 ; j < RENDERSTATE_NUM ; j++)
            {
                tsru->setRenderState((RENDER_STATE_TYPE)j, getSpatial()->getRenderState((RENDER_STATE_TYPE)j), NOT_OWN);
            }


            tsru->setNeedGenerateShadow(true);
            if(USEVSM)
            {
                tsru->setShaderName(VSM_SHADER);
                tsru->setRenderName(VSM_RENDERER);
                SE_Application::getInstance()->getRenderManager()->setNeedBlurShadow(false);
            }
            else
            {
                tsru->setShaderName(DRAWDEPTH_SHADER);
                tsru->setRenderName(DRAWDEPTH_RENDERER);
            }

            tsru->setEnableCullFace(true);



            tsru->setRenderTarget(rt);

            ruv.push_back(tsru);
        }
    }
    return ruv;
}
コード例 #3
0
ファイル: SE_MeshSimObject.cpp プロジェクト: wljcom/3DHomeHD
void SE_MeshSimObject::inflate()
{
    SE_MeshTransfer* meshTransfer = SE_Application::getInstance()->getResourceManager()->getMeshTransfer(mMeshID);
    if(!meshTransfer)
    {
        //mMeshID = SE_MeshID::INVALID;
        if(SE_Application::getInstance()->SEHomeDebug)
            LOGI("[%s] meshTransfer not found!!!!,mesh id is %s\n",this->getName(),mMeshID.getStr());
        return;
    }



    if(mMesh)
    {
        //the object has inflated
        return;
    }

    SE_ResourceManager* resourceManager = SE_Application::getInstance()->getResourceManager();


    mMesh = meshTransfer->createMesh(SE_Application::getInstance()->getResourceManager());

    if(mMesh)
    {
        resourceManager->setObjectMesh(mMeshID,mMesh);
        mMesh->setMeshID(mMeshID);


        resourceManager->registerRes(SE_ResourceManager::MESH_RES, &mMeshID);
        resourceManager->registerRes(SE_ResourceManager::OBJECT_MESH_RES, &mMeshID);
        mOwnMesh = OWN;
    }
    else
    {
        return;
    }

    SE_Geometry* sp = (SE_Geometry*)getSpatial();

    if(!sp)
    {
        if(SE_Application::getInstance()->SEHomeDebug)
            LOGI("Error !!!!Mesh simobject not attach to a spatial !!!!!!!!!\n");
    }

    bool mipmap = sp->isNeedGenerateMipMap();
    if(!mipmap)
    {
        int num = this->getMesh()->getSurfaceNum();
        for(int i = 0; i < num; ++i)
        {
            SE_Texture* tx = this->getMesh()->getSurface(i)->getTexture();
            if(!tx)
            {
                continue;
            }
            int txnum = tx->getTexUnitNum();
            for(int j = 0; j < txnum; ++j)
            {
                tx->getTextureUnit(j)->setSampleMin(LINEAR);
            }
        }
    }
    SE_Vector4f spatialData = sp->getEffectData();
    int num = this->getMesh()->getSurfaceNum();

    for(int i = 0; i < num; ++i)
    {
        this->getMesh()->getSurface(i)->getMaterialData()->shiny = spatialData.x;
        this->getMesh()->getSurface(i)->getMaterialData()->shinessStrength = spatialData.y;

    }

    this->getSpatial()->applyLight();

}
コード例 #4
0
ファイル: SE_MeshSimObject.cpp プロジェクト: wljcom/3DHomeHD
SE_SimObject::RenderUnitVector SE_MeshSimObject::createRenderUnit()
{
    if(!mMesh)
        return RenderUnitVector();
    RenderUnitVector ruv;

    SE_SimObject* simple = getSpatial()->getSimpleObject();

    if(!simple)
    {
        simple = this;
    }

    bool enableDof =  SE_Application::getInstance()->getCurrentCamera()->isNeedDof();

    SE_Camera* c = SE_Application::getInstance()->getCurrentCamera();
    if(this->getSpatial()->isSpatialEffectHasAttribute(SE_SpatialAttribute::MIRRORGENERATOR) &&( SE_Application::getInstance()->getRenderManager()->isNeedUpdateMirrorMap() || c->isChanged()) )
    {
        SE_Application::getInstance()->getRenderManager()->insertMirrorGenerator(this->getSpatial());
    }

    if(this->getSpatial()->isSpatialEffectHasAttribute(SE_SpatialAttribute::SHADOWGENERATOR) &&( SE_Application::getInstance()->getRenderManager()->isNeedUpdateShadowMap() || c->isChanged()) )
    {
        SE_Application::getInstance()->getRenderManager()->insertShadowGenerator(this->getSpatial());
    }

    if(!SE_Application::getInstance()->getSceneManager()->isSceneManagerHasStatus(ENABLELIGHT))
    {
        this->getSpatial()->setSpatialEffectAttribute(SE_SpatialAttribute::LIGHTING,false);
    }

    if(this->getSpatial()->isSpatialEffectHasAttribute(SE_SpatialAttribute::SHADOWOBJECT))
    {
        //if enable shadow, disable draw shadow object
        this->getSpatial()->setShadowObjectVisibility(false);
        return RenderUnitVector();;
    }

    //render object
    int surfaceNum = getSurfaceNum();
    for(int i = 0 ; i < surfaceNum; i++)
    {
        std::string indexStr = SE_Util::intToString(i);
        std::string renderUnitName = std::string(getName()) + "_" + indexStr;
        SE_Surface* surface = mMesh->getSurface(i);
        //SE_TriSurfaceRenderUnit* tsru = new SE_TriSurfaceRenderUnit(surface);

#ifdef USE_RUMANAGER
        SE_RenderUnitManager* srum = SE_Application::getInstance()->getRenderUnitManager();
        SE_TriSurfaceRenderUnit* tsru = (SE_TriSurfaceRenderUnit*)srum->find(renderUnitName.c_str());

        if(!tsru)
        {
            tsru = new SE_TriSurfaceRenderUnit(surface);
            srum->insert(renderUnitName.c_str(),tsru);
        }
        else
        {
            tsru->reset();
        }
#else
        SE_TriSurfaceRenderUnit* tsru = new SE_TriSurfaceRenderUnit(surface);
#endif

        if(this->getSpatial()->isSpatialHasRuntimeAttribute(SE_SpatialAttribute::IGNORVERTEXBUFFER))
        {
            tsru->setDontUseVertexBuffer(true);
        }


        tsru->setTexCoordXYReverse(this->getSpatial()->getTexCoordXYReverse());


        if(enableDof)
        {
            tsru->setName(renderUnitName.c_str());
            tsru->setPrimitiveType(getPrimitiveType());
            tsru->setRenderableSpatial(this->getSpatial());
            if(!isUseWorldMatrix())
            {
                tsru->setWorldTransform(getSpatial()->getWorldTransform().mul(getLocalMatrix()));
            }
            else
            {
                tsru->setWorldTransform(getWorldMatrix());
            }
            //SE_RenderState** rs = getRenderState();
            for(int j = 0 ; j < RENDERSTATE_NUM ; j++)
            {
                //tsru->setRenderState((RENDER_STATE_TYPE)j, rs[j], NOT_OWN);
                tsru->setRenderState((RENDER_STATE_TYPE)j, getSpatial()->getRenderState((RENDER_STATE_TYPE)j), NOT_OWN);
            }

            //fix me:
            tsru->setBlendState(false);

            tsru->setLayer(*getSpatial()->getWorldLayer());
            bool needCullFace = getSpatial()->isSpatialEffectHasAttribute(SE_SpatialAttribute::CULLFACE);
            tsru->setEnableCullFace(needCullFace);

            if(this->getSpatial()->isSpatialEffectHasAttribute(SE_SpatialAttribute::LIGHTING))
            {
                tsru->setShaderName(DOFLIGHTGEN_SHADER);
                tsru->setRenderName(DOFLIGHTGEN_RENDERER);
            }
            else
            {
                tsru->setShaderName(DOFGEN_SHADER);
                tsru->setRenderName(DOFGEN_RENDERER);
            }
            //tsru->setRenderToFbo(true);
            tsru->setNeedDofGen(true);
            SE_Application::getInstance()->getRenderManager()->setNeedBlurShadow(true);

        }
        else
        {
            SE_Application::getInstance()->getRenderManager()->setNeedBlurShadow(false);

            tsru->setName(renderUnitName.c_str());
            tsru->setPrimitiveType(getPrimitiveType());
            tsru->setRenderableSpatial(this->getSpatial());

            SE_AABBBV* aabbbv = (SE_AABBBV*)getSpatial()->getWorldBoundingVolume();

            if(aabbbv)
            {
                SE_Vector3f min = aabbbv->getGeometry().getMin();
                SE_Vector3f max = aabbbv->getGeometry().getMax();
                tsru->setMinBounding(min);
                tsru->setMaxBounding(max);
            }

            //tsru->setNewImageKey(mSecondImageKey.c_str());

            if(!isUseWorldMatrix())
            {
                tsru->setWorldTransform(getSpatial()->getWorldTransform().mul(getLocalMatrix()));
            }
            else
            {
                tsru->setWorldTransform(getWorldMatrix());
            }
            //SE_RenderState** rs = getRenderState();
            for(int j = 0 ; j < RENDERSTATE_NUM ; j++)
            {
                //tsru->setRenderState((RENDER_STATE_TYPE)j, rs[j], NOT_OWN);
                tsru->setRenderState((RENDER_STATE_TYPE)j, getSpatial()->getRenderState((RENDER_STATE_TYPE)j), NOT_OWN);
            }

            if(this->getSpatial()->isSpatialEffectHasAttribute(SE_SpatialAttribute::BLENDABLE))
            {
                tsru->setBlendState(true);
                tsru->setAlpha(this->getSpatial()->getAlpha());

            }
            else
            {
                tsru->setBlendState(false);
            }

            if(this->getSpatial()->isNeedForeverBlend())
            {
                tsru->setBlendState(true);
                this->getSpatial()->setSpatialEffectAttribute(SE_SpatialAttribute::BLENDABLE,true);
                SE_Vector4f d = this->getSpatial()->getEffectData();
                if(d.z > 0.1)
                {
                    tsru->setAlpha(d.z);
                }
                else
                {
                    tsru->setAlpha(this->getSpatial()->getAlpha());
                }
            }

            //for shadow object
            if(this->getSpatial()->isSpatialEffectHasAttribute(SE_SpatialAttribute::SHADOWOBJECT))
            {
                tsru->setBlendState(true);
                tsru->setAlpha(1.0);
#if 0
                SE_Layer* l = this->getSpatial()->getWorldLayer();
                if(this->getSpatial()->isSelected())
                {

                    l->setLayer(2);
                }
                else
                {
                    l->setLayer(0);
                }
#endif
            }

            tsru->setLayer(*getSpatial()->getWorldLayer());

            bool needCullFace = getSpatial()->isSpatialEffectHasAttribute(SE_SpatialAttribute::CULLFACE);
            tsru->setEnableCullFace(needCullFace);
            tsru->setShaderName(DEFAULT_SHADER);
            tsru->setRenderName(DEFAULT_RENDERER);
            if(this->getSpatial()->isSpatialEffectHasAttribute(SE_SpatialAttribute::NEEDFOG))
            {
                tsru->setShaderName(DEFAULTFOG_SHADER);
                tsru->setRenderName(DEFAULTFOG_RENDERER);
            }

            tsru->setIsUseFbo(false);

            //one object has just one effect,now
            /*int mirrorGeneratorCount = SE_Application::getInstance()->getSpatialManager()->mirrorGeneratorCount();
            int shadowGeneratorCount = SE_Application::getInstance()->getSpatialManager()->shadowGeneratorCount();*/


            if(this->getSpatial()->isSpatialEffectHasAttribute(SE_SpatialAttribute::ALPHATEST))
            {
                tsru->setShaderName(ALPHATEST_SHADER);
                tsru->setRenderName(ALPHATEST_RENDERER);
            }
            else if(this->getSpatial()->isSpatialEffectHasAttribute(SE_SpatialAttribute::FLAGWAVE))
            {
                tsru->setShaderName(FLAGWAVE_SHADER);
                tsru->setRenderName(FLAGWAVE_RENDERER);
                if(this->getSpatial()->isSpatialEffectHasAttribute(SE_SpatialAttribute::NEEDFOG))
                {
                    tsru->setShaderName(FLAGWAVEFOG_SHADER);
                    tsru->setRenderName(FLAGWAVEFOG_RENDERER);
                }
                tsru->setEnableCullFace(false);
            }
            else if(this->getSpatial()->isSpatialEffectHasAttribute(SE_SpatialAttribute::CLOAKFLAGWAVE))
            {
                tsru->setShaderName(CLOAKFLAGWAVE_SHADER);
                tsru->setRenderName(CLOAKFLAGWAVE_RENDERER);
                tsru->setEnableCullFace(false);
            }
            else if(this->getSpatial()->isNeedDrawLine())
            {
                tsru->setShaderName(DRAWLINE_SHADER);
                tsru->setRenderName(DRAWLINE_RENDERER);
                tsru->setDontUseVertexBuffer(true);

            }
            else if(this->getSpatial()->isSpatialEffectHasAttribute(SE_SpatialAttribute::SHADOWRENDER))
            {
                tsru->setNeedRenderShadow(true);
                if(USEVSM)
                {
                    //vsm
                    //need render shadow,disable other fbo function
                    tsru->setFboReplaceCurrentTexture(false);
                    tsru->setShaderName(SHADOWMAP_SHADER);
                    tsru->setRenderName(SHADOWMAP_RENDERER);
                    tsru->setNeedUseBluredShadowMap(false);
                    //tsru->setIsUseFbo(true);
                    if(tsru->getRenderableSpatial()->isSpatialEffectHasAttribute(SE_SpatialAttribute::LIGHTING))
                    {
                        tsru->setShaderName(SHADOWMAPWITHLIGHT_SHADER);
                        tsru->setRenderName(SHADOWMAPWITHLIGHT_RENDERER);
                    }

                }
                else
                {
                    //normal shadow map
                    tsru->setShaderName(RENDERDEPTHSHADOW_SHADER);
                    tsru->setRenderName(RENDERDEPTHSHADOW_RENDERER);
                }

            }
            else if(this->getSpatial()->isSpatialEffectHasAttribute(SE_SpatialAttribute::MIRRORRENDER))
            {
                tsru->setNeedRenderMirror(true);
                tsru->setFboReplaceCurrentTexture(false);
                tsru->setShaderName(MIRROR_SHADER);
                tsru->setRenderName(MIRROR_RENDERER);
                tsru->setIsUseFbo(true);
                tsru->setBlendState(this->getSpatial()->isSpatialEffectHasAttribute(SE_SpatialAttribute::BLENDABLE));

#if 0
                SE_Layer* l = this->getSpatial()->getWorldLayer();
                l->setLayer(3);
#endif

                tsru->setLayer(*getSpatial()->getWorldLayer());

                tsru->setAlpha(this->getSpatial()->getAlpha());

                //tsru->setMirrorObject(this->getSpatial());
                tsru->setMirrorPlan(this->getSpatial()->getMirrorPlan());

            }
            else if(this->getSpatial()->isSpatialEffectHasAttribute(SE_SpatialAttribute::UVANIMATION))
            {
                tsru->setShaderName(UVANIMATION_SHADER);
                tsru->setRenderName(UVANIMATION_RENDERER);
                if(this->getSpatial()->isSpatialEffectHasAttribute(SE_SpatialAttribute::NEEDFOG))
                {
                    //disable now
                    /*
                    tsru->setShaderName(UVANIMATIONFOG_SHADER);
                    tsru->setRenderName(UVANIMATIONFOG_RENDERER);
                    */
                }
                tsru->setTexCoordOffset(this->getSpatial()->getTexCoordOffset());
            }
            else if(this->getSpatial()->isNeedParticle())
            {
                tsru->setShaderName(PARTICLE_SHADER);
                tsru->setRenderName(PARTICLE_RENDERER);
                if(this->getSpatial()->isNeedDepthTest())
                {
                    tsru->setDepthState(true);
                }
                else
                {
                    tsru->setDepthState(false);
                }
            }
            else if(this->getSpatial()->isSpatialEffectHasAttribute(SE_SpatialAttribute::LIGHTING))
            {
                if(this->getMesh()->getSurface(0)->hasSpotLight())
                {
                    tsru->setShaderName(SIMPLELIGHTING_SPOT_SHADER);
                    tsru->setRenderName(SIMPLELIGHTING_SPOT_RENDERER);
                }
                else
                {
#ifdef WIN32
                    tsru->setShaderName(SIMPLELIGHTING_SHADER);
                    tsru->setRenderName(SIMPLELIGHTING_RENDERER);
#else
                    tsru->setShaderName(SIMPLELIGHTING_SHADER);
                    tsru->setRenderName(SIMPLELIGHTING_RENDERER);
#endif
                }

                //for "pc_face" object
                tsru->setNeedSpecLight(this->getSpatial()->isNeedSpecLight());

            }
            else
            {

            }

#if 0

            tsru->setRenderToFbo(true);
//just for demo

            std::string spatialname = this->getSpatial()->getSpatialName();

            //
            if(spatialname == "guang@group_house@ceshi_basedata.cbf" || spatialname == "guang1@group_house@ceshi_basedata.cbf" || spatialname == "guang2@group_house@ceshi_basedata.cbf"
                    || spatialname == "guang3@group_house@ceshi_basedata.cbf" || spatialname == "guang4@group_house@ceshi_basedata.cbf" || spatialname == "guang05@group_house@ceshi_basedata.cbf"
                    || spatialname == "guang06@group_house@ceshi_basedata.cbf")
            {
                SE_Layer* l = this->getSpatial()->getWorldLayer();
                l->setLayer(2);
                tsru->setLayer(*l);
                tsru->setNeedColorEffect(true);
                tsru->setBlendState(true);
                tsru->setAlpha(1.0);
            }
            if(spatialname == "Object50@group_house@ceshi_basedata.cbf" || spatialname == "Object51@group_house@ceshi_basedata.cbf" || spatialname == "Object52@group_house@ceshi_basedata.cbf"
                    || spatialname == "Object53@group_house@ceshi_basedata.cbf" || spatialname == "Object54@group_house@ceshi_basedata.cbf" || spatialname == "Object55@group_house@ceshi_basedata.cbf"
                    || spatialname == "Object02@group_house@ceshi_basedata.cbf" || spatialname == "Object56@group_house@ceshi_basedata.cbf")
            {
                SE_Layer* l = this->getSpatial()->getWorldLayer();
                l->setLayer(1);
                tsru->setLayer(*l);
            }

            if(spatialname == "wenzi@group_house@ceshi_basedata.cbf" || spatialname == "Box01@group_house@ceshi_basedata.cbf"
                    || spatialname == "Box02@group_house@ceshi_basedata.cbf" || spatialname == "Box03@group_house@ceshi_basedata.cbf"
                    || spatialname == "Plane18@group_house@ceshi_basedata.cbf")
            {
                tsru->setNeedHighLight(true);
            }
#endif


        }

        ruv.push_back(tsru);
    }

#if 0
    //forward additive
    if(this->getSpatial()->isNeedLighting() && enablelighting && !this->getSpatial()->isNeedBlend()  && 0)
    {

        for(int i = 0 ; i < surfaceNum; i++)
        {
            std::string indexStr = SE_Util::intToString(i);
            std::string renderUnitName = std::string(getName()) + "_" + indexStr;
            SE_Surface* surface = mMesh->getSurface(i);
            //SE_TriSurfaceRenderUnit* tsru = new SE_TriSurfaceRenderUnit(surface);

#ifdef USE_RUMANAGER
            SE_RenderUnitManager* srum = SE_Application::getInstance()->getRenderUnitManager();
            SE_TriSurfaceRenderUnit* tsru = (SE_TriSurfaceRenderUnit*)srum->find(renderUnitName.c_str());

            if(!tsru)
            {
                tsru = new SE_TriSurfaceRenderUnit(surface);
                srum->insert(renderUnitName.c_str(),tsru);
            }
            else
            {
                tsru->reset();
            }
#else
            SE_TriSurfaceRenderUnit* tsru = new SE_TriSurfaceRenderUnit(surface);
#endif


            tsru->setName(renderUnitName.c_str());
            tsru->setPrimitiveType(getPrimitiveType());
            tsru->setRenderableSpatial(this->getSpatial());
            if(!isUseWorldMatrix())
            {
                tsru->setWorldTransform(getSpatial()->getWorldTransform().mul(getLocalMatrix()));
            }
            else
            {
                tsru->setWorldTransform(getWorldMatrix());
            }

            //SE_RenderState** rs = getRenderState();
            for(int j = 0 ; j < RENDERSTATE_NUM ; j++)
            {
                //tsru->setRenderState((RENDER_STATE_TYPE)j, rs[j], NOT_OWN);
                tsru->setRenderState((RENDER_STATE_TYPE)j, getSpatial()->getRenderState((RENDER_STATE_TYPE)j), NOT_OWN);
            }


            //additive do not need blend
            tsru->setBlendState(false);

            tsru->setLayer(*getSpatial()->getWorldLayer());
            bool needCullFace = getSpatial()->isSpatialEffectHasAttribute(SE_SpatialAttribute::CULLFACE);
            tsru->setEnableCullFace(needCullFace);
            tsru->setShaderName(DEFAULT_SHADER);
            tsru->setRenderName(DEFAULT_RENDERER);
            tsru->setIsUseFbo(false);

            tsru->setIsAdditive(1);

            //one object has just one effect,now

            if(this->getSpatial()->isNeedLighting() && enablelighting)
            {
#ifdef WIN32
                tsru->setShaderName(SIMPLELIGHTING_SHADER);
                tsru->setRenderName(SIMPLELIGHTING_RENDERER);
#else
                tsru->setShaderName(SIMPLELIGHTINGPLUGIN_SHADER);
                tsru->setRenderName(SIMPLELIGHTINGPLUGIN_RENDERER);
#endif

            }

            else
            {
                //do not need render shadow
                //set replace current mesh texture
                //bool replace = getMesh()->getSurface(0)->isNeedFboReplaceCurrentTexture();
                //tsru->setFboReplaceCurrentTexture(replace);

                ////which mesh texture should be replace with fbo(0-3)
                //tsru->setFboReplaceTextureIndex(getMesh()->getSurface(0)->getFboReplaceTextureIndex());

                //std::string fboname = surface->getUsedFboName();
                //if(fboname.empty())
                //{
                //    tsru->setUsedFboName(getSpatial()->getSpatialName());
                //}
                //else
                //{
                //    tsru->setUsedFboName(fboname.c_str());
                //}
            }

            ruv.push_back(tsru);
        }
    }
#endif

    return ruv;
}