Esempio n. 1
0
        void StaticMeshObject_AddToRenderQueue(StaticMeshObject staticMeshObject,
                                               Camera camera, ref bool allowRender)
        {
            if (needMaterialAlpha != 1)
            {
                if (shaderBaseMaterial != null)
                {
                    //ShaderBase high level material

                    float      diffusePower = shaderBaseMaterial.DiffusePower;
                    ColorValue diffuse      = shaderBaseMaterial.DiffuseColor *
                                              new ColorValue(diffusePower, diffusePower, diffusePower, 1);
                    staticMeshObject.SetCustomGpuParameter(
                        (int)ShaderBaseMaterial.GpuParameters.dynamicDiffuseScale,
                        new Vec4(diffuse.Red, diffuse.Green, diffuse.Blue,
                                 diffuse.Alpha * needMaterialAlpha));
                }
                else if (clonedStandardMaterial != null)
                {
                    //standard material

                    foreach (Technique technique in clonedStandardMaterial.Techniques)
                    {
                        foreach (Pass pass in technique.Passes)
                        {
                            ColorValue diffuse = pass.Diffuse;
                            pass.Diffuse = new ColorValue(diffuse.Red, diffuse.Green,
                                                          diffuse.Blue, needMaterialAlpha);
                        }
                    }
                }
            }
        }
Esempio n. 2
0
        void DestroyDecal()
        {
            if (staticMeshObject != null)
            {
                staticMeshObject.AddToRenderQueue -= StaticMeshObject_AddToRenderQueue;
                staticMeshObject.Dispose();
                staticMeshObject = null;
            }

            if (clonedStandardMaterial != null)
            {
                clonedStandardMaterial.Dispose();
                clonedStandardMaterial = null;
            }
        }
Esempio n. 3
0
        void StaticMeshObject_AddToRenderQueue( StaticMeshObject staticMeshObject,
            Camera camera, ref bool allowRender)
        {
            if( needMaterialAlpha != 1 )
            {
                if( shaderBaseMaterial != null )
                {
                    //ShaderBase high level material

                    float diffusePower = shaderBaseMaterial.DiffusePower;
                    ColorValue diffuse = shaderBaseMaterial.DiffuseColor *
                        new ColorValue( diffusePower, diffusePower, diffusePower, 1 );
                    staticMeshObject.SetCustomGpuParameter(
                        (int)ShaderBaseMaterial.GpuParameters.dynamicDiffuseScale,
                        new Vec4( diffuse.Red, diffuse.Green, diffuse.Blue,
                        diffuse.Alpha * needMaterialAlpha ) );
                }
                else if( clonedStandardMaterial != null )
                {
                    //standard material

                    foreach( Technique technique in clonedStandardMaterial.Techniques )
                    {
                        foreach( Pass pass in technique.Passes )
                        {
                            ColorValue diffuse = pass.Diffuse;
                            pass.Diffuse = new ColorValue( diffuse.Red, diffuse.Green,
                                diffuse.Blue, needMaterialAlpha );
                        }
                    }
                }
            }
        }
Esempio n. 4
0
        void DestroyDecal()
        {
            if( staticMeshObject != null )
            {
                staticMeshObject.AddToRenderQueue -= StaticMeshObject_AddToRenderQueue;
                staticMeshObject.Dispose();
                staticMeshObject = null;
            }

            if( clonedStandardMaterial != null )
            {
                clonedStandardMaterial.Dispose();
                clonedStandardMaterial = null;
            }
        }
Esempio n. 5
0
        void CreateDecal()
        {
            Bounds bounds = Bounds.Cleared;
            foreach( Vertex vertex in vertices )
                bounds.Add( vertex.position );

            VertexData vertexData = new VertexData();
            IndexData indexData = new IndexData();

            //init vertexData
            VertexDeclaration declaration = vertexData.VertexDeclaration;
            declaration.AddElement( 0, 0, VertexElementType.Float3, VertexElementSemantic.Position );
            declaration.AddElement( 0, 12, VertexElementType.Float3, VertexElementSemantic.Normal );
            declaration.AddElement( 0, 24, VertexElementType.Float2,
                VertexElementSemantic.TextureCoordinates, 0 );
            declaration.AddElement( 0, 32, VertexElementType.Float3, VertexElementSemantic.Tangent );

            VertexBufferBinding bufferBinding = vertexData.VertexBufferBinding;
            HardwareVertexBuffer vertexBuffer = HardwareBufferManager.Instance.CreateVertexBuffer(
                44, vertices.Length, HardwareBuffer.Usage.StaticWriteOnly );
            bufferBinding.SetBinding( 0, vertexBuffer, true );
            vertexData.VertexCount = vertices.Length;

            //init indexData
            Trace.Assert( vertices.Length < 65536, "Decal: vertices.Length < 65536" );

            HardwareIndexBuffer indexBuffer = HardwareBufferManager.Instance.CreateIndexBuffer(
                HardwareIndexBuffer.IndexType._16Bit, indices.Length,
                HardwareBuffer.Usage.StaticWriteOnly );
            indexData.SetIndexBuffer( indexBuffer, true );
            indexData.IndexCount = indices.Length;

            //init material
            Material material = null;

            shaderBaseMaterial = HighLevelMaterialManager.Instance.
                GetMaterialByName( sourceMaterialName ) as ShaderBaseMaterial;
            //only default shader technique for ShaderBase material
            if( shaderBaseMaterial != null && !shaderBaseMaterial.IsDefaultTechniqueCreated() )
                shaderBaseMaterial = null;

            if( shaderBaseMaterial != null )
            {
                //ShaderBase material
                material = shaderBaseMaterial.BaseMaterial;
            }
            else
            {
                //standard material or fallback ShaderBase technique
                Material sourceMaterial = MaterialManager.Instance.GetByName( sourceMaterialName );
                if( sourceMaterial != null )
                {
                    //clone standard material
                    clonedStandardMaterial = MaterialManager.Instance.Clone( sourceMaterial,
                        MaterialManager.Instance.GetUniqueName( sourceMaterialName + "_Cloned" ) );
                    material = clonedStandardMaterial;
                }
            }

            staticMeshObject = SceneManager.Instance.CreateStaticMeshObject( bounds + Position,
                Position, Quat.Identity, new Vec3( 1, 1, 1 ), material, vertexData, indexData, true );
            staticMeshObject.AddToRenderQueue += StaticMeshObject_AddToRenderQueue;

            UpdateBuffers();
        }
        //static bool IsIntersects( RenderLight light, Sphere boundingSphere )
        //{
        //   if( light.Type == RenderLightType.Point || light.Type == RenderLightType.Spot )
        //   {
        //      //check by bounding sphere
        //      {
        //         float range = light.AttenuationFar;
        //         Sphere lightSphere = new Sphere( light.Position, range );
        //         if( !lightSphere.IsIntersectsSphere( ref boundingSphere ) )
        //            return false;
        //      }
        //      //check by spot light clip planes
        //      if( light.Type == RenderLightType.Spot )
        //      {
        //         foreach( Plane plane in light.SpotLightClipPlanes )
        //         {
        //            if( plane.GetDistance( boundingSphere.Origin ) > boundingSphere.Radius )
        //               return false;
        //         }
        //      }
        //   }
        //   return true;
        //}
        public override void OnSceneManagementGetAffectingLightsForObject( Camera camera,
			RenderLight[] affectingLights, StaticMeshObject staticMeshObject )
        {
            if( tempLightArray.Length != affectingLights.Length )
                tempLightArray = new RenderLight[ affectingLights.Length ];

            int count = 0;

            foreach( RenderLight light in affectingLights )
            {
                if( light.Type == RenderLightType.Point || light.Type == RenderLightType.Spot )
                {
                    if( !IsIntersects( light, staticMeshObject.Bounds ) )
                        continue;
                }

                tempLightArray[ count ] = light;
                count++;
            }

            staticMeshObject.SetAffectingLights( tempLightArray, count );
        }
Esempio n. 7
0
        void CreateDecal()
        {
            Bounds bounds = Bounds.Cleared;

            foreach (Vertex vertex in vertices)
            {
                bounds.Add(vertex.position);
            }

            VertexData vertexData = new VertexData();
            IndexData  indexData  = new IndexData();

            //init vertexData
            VertexDeclaration declaration = vertexData.VertexDeclaration;

            declaration.AddElement(0, 0, VertexElementType.Float3, VertexElementSemantic.Position);
            declaration.AddElement(0, 12, VertexElementType.Float3, VertexElementSemantic.Normal);
            declaration.AddElement(0, 24, VertexElementType.Float2,
                                   VertexElementSemantic.TextureCoordinates, 0);
            declaration.AddElement(0, 32, VertexElementType.Float3, VertexElementSemantic.Tangent);

            VertexBufferBinding  bufferBinding = vertexData.VertexBufferBinding;
            HardwareVertexBuffer vertexBuffer  = HardwareBufferManager.Instance.CreateVertexBuffer(
                44, vertices.Length, HardwareBuffer.Usage.StaticWriteOnly);

            bufferBinding.SetBinding(0, vertexBuffer, true);
            vertexData.VertexCount = vertices.Length;

            //init indexData
            Trace.Assert(vertices.Length < 65536, "Decal: vertices.Length < 65536");

            HardwareIndexBuffer indexBuffer = HardwareBufferManager.Instance.CreateIndexBuffer(
                HardwareIndexBuffer.IndexType._16Bit, indices.Length,
                HardwareBuffer.Usage.StaticWriteOnly);

            indexData.SetIndexBuffer(indexBuffer, true);
            indexData.IndexCount = indices.Length;

            //init material
            Material material = null;

            shaderBaseMaterial = HighLevelMaterialManager.Instance.
                                 GetMaterialByName(sourceMaterialName) as ShaderBaseMaterial;
            //only default shader technique for ShaderBase material
            if (shaderBaseMaterial != null && !shaderBaseMaterial.IsDefaultTechniqueCreated())
            {
                shaderBaseMaterial = null;
            }

            if (shaderBaseMaterial != null)
            {
                //ShaderBase material
                material = shaderBaseMaterial.BaseMaterial;
            }
            else
            {
                //standard material or fallback ShaderBase technique
                Material sourceMaterial = MaterialManager.Instance.GetByName(sourceMaterialName);
                if (sourceMaterial != null)
                {
                    //clone standard material
                    clonedStandardMaterial = MaterialManager.Instance.Clone(sourceMaterial,
                                                                            MaterialManager.Instance.GetUniqueName(sourceMaterialName + "_Cloned"));
                    material = clonedStandardMaterial;
                }
            }

            staticMeshObject = SceneManager.Instance.CreateStaticMeshObject(bounds + Position,
                                                                            Position, Quat.Identity, new Vec3(1, 1, 1), true, material, vertexData, indexData, true);
            staticMeshObject.AddToRenderQueue += StaticMeshObject_AddToRenderQueue;

            UpdateBuffers();
        }