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); } } } } }
void DestroyDecal() { if (staticMeshObject != null) { staticMeshObject.AddToRenderQueue -= StaticMeshObject_AddToRenderQueue; staticMeshObject.Dispose(); staticMeshObject = null; } if (clonedStandardMaterial != null) { clonedStandardMaterial.Dispose(); clonedStandardMaterial = null; } }
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 ); } } } } }
void DestroyDecal() { if( staticMeshObject != null ) { staticMeshObject.AddToRenderQueue -= StaticMeshObject_AddToRenderQueue; staticMeshObject.Dispose(); staticMeshObject = null; } if( clonedStandardMaterial != null ) { clonedStandardMaterial.Dispose(); clonedStandardMaterial = null; } }
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 ); }
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(); }