protected override void CreateScene() { mSceneMgr.AmbientLight = new ColourValue(1, 1, 1); //Entity ent = mSceneMgr.CreateEntity("Head", "ogrehead.mesh"); //SceneNode node = mSceneMgr.RootSceneNode.CreateChildSceneNode("HeadNode"); //node.AttachObject(ent); MaterialPtr mat = MaterialManager.Singleton.Create("BoxColor", "General", true); Technique tech = mat.GetTechnique(0); Pass pass = tech.GetPass(0); TextureUnitState tex = pass.CreateTextureUnitState(); tex.SetTextureName("sphax.jpg", TextureType.TEX_TYPE_2D); tex.NumMipmaps = 0; tex.TextureAnisotropy = 0; tex.SetTextureFiltering(FilterOptions.FO_POINT, FilterOptions.FO_POINT, FilterOptions.FO_POINT); //pass.DepthWriteEnabled=false; //pass.SetSceneBlending(SceneBlendType.SBT_TRANSPARENT_ALPHA); //pass.CullingMode = CullingMode.CULL_NONE; //mCamMan = new Tutorials.CameraMan(mCamera,mc); //mCameraMan = null; mCamera.SetPosition((float)mc.x, (float)mc.y, (float)mc.z); mCamera.Pitch(new Degree(mc.pitch).ValueRadians); mCamera.Yaw(new Degree(mc.yaw).ValueRadians); oldCamPos = mCamera.Position; }
void CreateDefaultTechnique( out bool notSupported ) { notSupported = false; string sourceFile = "Materials\\Common\\Water.cg_hlsl"; string vertexSyntax; string fragmentSyntax; { if( RenderSystem.Instance.IsDirect3D() ) { if( RenderSystem.Instance.HasShaderModel3() ) { vertexSyntax = "vs_3_0"; fragmentSyntax = "ps_3_0"; } else { vertexSyntax = "vs_2_0"; fragmentSyntax = "ps_2_0"; } } else { vertexSyntax = "arbvp1"; fragmentSyntax = "arbfp1"; } } if( !RenderSystem.Instance.HasShaderModel2() || !RenderSystem.Instance.Capabilities.UserClipPlanes ) { notSupported = true; return; } BaseMaterial.ReceiveShadows = false; Technique tecnhique = BaseMaterial.CreateTechnique(); Pass pass = tecnhique.CreatePass(); //generate compileArguments and bind textures StringBuilder compileArguments = new StringBuilder( 128 ); //transparent surface if( owner.DeepColor.Alpha != 1 || owner.ShallowColor.Alpha != 1 ) { pass.SourceBlendFactor = SceneBlendFactor.SourceAlpha; pass.DestBlendFactor = SceneBlendFactor.OneMinusSourceAlpha; pass.DepthWrite = false; compileArguments.Append( " -DTRANSPARENT" ); } //disable Direct3D standard fog features pass.SetFogOverride( FogMode.None, new ColorValue( 0, 0, 0 ), 0, 0, 0 ); //bool direct3d = RenderSystem.Instance.Name.Contains( "Direct3D" ); //compileArguments.Append( direct3d ? " -DDIRECT3D" : " -DOPENGL" ); //Fog FogMode fogMode = SceneManager.Instance.GetFogMode(); if( fogMode != FogMode.None ) { compileArguments.Append( " -DFOG_ENABLED" ); compileArguments.Append( " -DFOG_" + fogMode.ToString().ToUpper() ); } //noiseMap { TextureUnitState state = pass.CreateTextureUnitState(); state.SetTextureName( "Types\\Special\\WaterPlane\\WaterNoise.dds", Texture.Type.Type2D ); } //reflectionMap if( owner.ReflectionLevel != WaterPlane.ReflectionLevels.None ) { compileArguments.Append( " -DREFLECTION_MAP" ); reflectionMapState = pass.CreateTextureUnitState(); if( owner.ReflectionTexture != null ) reflectionMapState.SetTextureName( owner.ReflectionTexture.Name ); reflectionMapState.SetTextureAddressingMode( TextureAddressingMode.Clamp ); reflectionMapState.SetTextureFiltering( FilterOptions.Linear, FilterOptions.Linear, FilterOptions.None ); } //vertex program { string errorString; GpuProgram program = GpuProgramCacheManager.Instance.AddProgram( "WaterPlane_Vertex_", GpuProgramType.VertexProgram, sourceFile, "main_vp", vertexSyntax, compileArguments.ToString(), out errorString ); if( !string.IsNullOrEmpty( errorString ) ) Log.Fatal( errorString ); if( program != null ) { GpuProgramParameters parameters = program.DefaultParameters; SetProgramAutoConstants( parameters ); pass.VertexProgramName = program.Name; } } //fragment program { string errorString; GpuProgram program = GpuProgramCacheManager.Instance.AddProgram( "WaterPlane_Fragment_", GpuProgramType.FragmentProgram, sourceFile, "main_fp", fragmentSyntax, compileArguments.ToString(), out errorString ); if( !string.IsNullOrEmpty( errorString ) ) Log.Fatal( errorString ); if( program != null ) { SetProgramAutoConstants( program.DefaultParameters ); pass.FragmentProgramName = program.Name; } } }
protected override void load() { // clarabie - nov 18, 2008 // modified this to check for an existing material instead of always // creating a new one. Allows more flexibility, but also specifically allows us to // solve the problem of XNA not having fixed function support this._material = (Material)MaterialManager.Instance.GetByName("Fonts/" + _name); if (this._material == null) { // create a material for this font this._material = (Material)MaterialManager.Instance.Create("Fonts/" + _name, Group); TextureUnitState unitState = null; var blendByAlpha = false; if (this._fontType == FontType.TrueType) { #if !(XBOX || XBOX360) // create the font bitmap on the fly createTexture(); // a texture layer was added in CreateTexture unitState = this._material.GetTechnique(0).GetPass(0).GetTextureUnitState(0); blendByAlpha = true; #endif } else { // load this texture // TODO In general, modify any methods like this that throw their own exception rather than returning null, so the caller can decide how to handle a missing resource. this._texture = TextureManager.Instance.Load(Source, Group, TextureType.TwoD, 0); blendByAlpha = texture.HasAlpha; // pre-created font images unitState = Material.GetTechnique(0).GetPass(0).CreateTextureUnitState(Source); } // Make sure material is aware of colour per vertex. this._material.GetTechnique(0).GetPass(0).VertexColorTracking = TrackVertexColor.Diffuse; if (unitState != null) { // Clamp to avoid fuzzy edges unitState.SetTextureAddressingMode(TextureAddressing.Clamp); // Allow min/mag filter, but no mip unitState.SetTextureFiltering(FilterOptions.Linear, FilterOptions.Linear, FilterOptions.None); } // set up blending mode if (blendByAlpha) { this._material.SetSceneBlending(SceneBlendType.TransparentAlpha); } else { // assume black background here this._material.SetSceneBlending(SceneBlendType.Add); } } }
/// <summary> /// /// </summary> protected void Initialize() { // Create geometry int nvertices = this.slices * 4; // n+1 planes int elemsize = 3 * 3; int dsize = elemsize * nvertices; int x; var indexData = new IndexData(); var vertexData = new VertexData(); var vertices = new float[dsize]; var coords = new float[4, 2] { { 0.0f, 0.0f }, { 0.0f, 1.0f }, { 1.0f, 0.0f }, { 1.0f, 1.0f } }; for (x = 0; x < this.slices; x++) { for (int y = 0; y < 4; y++) { float xcoord = coords[y, 0] - 0.5f; float ycoord = coords[y, 1] - 0.5f; float zcoord = -((float)x / (float)(this.slices - 1) - 0.5f); // 1.0f .. a/(a+1) // coordinate vertices[x * 4 * elemsize + y * elemsize + 0] = xcoord * (this.size / 2.0f); vertices[x * 4 * elemsize + y * elemsize + 1] = ycoord * (this.size / 2.0f); vertices[x * 4 * elemsize + y * elemsize + 2] = zcoord * (this.size / 2.0f); // normal vertices[x * 4 * elemsize + y * elemsize + 3] = 0.0f; vertices[x * 4 * elemsize + y * elemsize + 4] = 0.0f; vertices[x * 4 * elemsize + y * elemsize + 5] = 1.0f; // tex vertices[x * 4 * elemsize + y * elemsize + 6] = xcoord * Utility.Sqrt(3.0f); vertices[x * 4 * elemsize + y * elemsize + 7] = ycoord * Utility.Sqrt(3.0f); vertices[x * 4 * elemsize + y * elemsize + 8] = zcoord * Utility.Sqrt(3.0f); } } var faces = new short[this.slices * 6]; for (x = 0; x < this.slices; x++) { faces[x * 6 + 0] = (short)(x * 4 + 0); faces[x * 6 + 1] = (short)(x * 4 + 1); faces[x * 6 + 2] = (short)(x * 4 + 2); faces[x * 6 + 3] = (short)(x * 4 + 1); faces[x * 6 + 4] = (short)(x * 4 + 2); faces[x * 6 + 5] = (short)(x * 4 + 3); } //setup buffers vertexData.vertexStart = 0; vertexData.vertexCount = nvertices; VertexDeclaration decl = vertexData.vertexDeclaration; VertexBufferBinding bind = vertexData.vertexBufferBinding; int offset = 0; offset += decl.AddElement(0, 0, VertexElementType.Float3, VertexElementSemantic.Position).Size; offset += decl.AddElement(0, offset, VertexElementType.Float3, VertexElementSemantic.Normal).Size; offset += decl.AddElement(0, offset, VertexElementType.Float3, VertexElementSemantic.TexCoords).Size; HardwareVertexBuffer vertexBuffer = HardwareBufferManager.Instance.CreateVertexBuffer(decl, nvertices, BufferUsage.StaticWriteOnly); bind.SetBinding(0, vertexBuffer); HardwareIndexBuffer indexBuffer = HardwareBufferManager.Instance.CreateIndexBuffer(IndexType.Size16, this.slices * 6, BufferUsage.StaticWriteOnly); indexData.indexBuffer = indexBuffer; indexData.indexCount = this.slices * 6; indexData.indexStart = 0; indexBuffer.WriteData(0, indexBuffer.Size, faces, true); vertexBuffer.WriteData(0, vertexBuffer.Size, vertices); vertices = null; faces = null; // Now make the render operation renderOperation.operationType = OperationType.TriangleList; renderOperation.indexData = indexData; renderOperation.vertexData = vertexData; renderOperation.useIndices = true; // Create a brand new private material if (!ResourceGroupManager.Instance.GetResourceGroups().Contains("VolumeRendable")) { ResourceGroupManager.Instance.CreateResourceGroup("VolumeRendable"); } var material = (Material)MaterialManager.Instance.Create(this.texture, "VolumeRendable"); // Remove pre-created technique from defaults material.RemoveAllTechniques(); // Create a techinique and a pass and a texture unit Technique technique = material.CreateTechnique(); Pass pass = technique.CreatePass(); TextureUnitState textureUnit = pass.CreateTextureUnitState(); // Set pass parameters pass.SetSceneBlending(SceneBlendType.TransparentAlpha); pass.DepthWrite = false; pass.CullingMode = CullingMode.None; pass.LightingEnabled = false; textureUnit.SetTextureAddressingMode(TextureAddressing.Clamp); textureUnit.SetTextureName(this.texture, TextureType.ThreeD); textureUnit.SetTextureFiltering(TextureFiltering.Trilinear); this.unit = textureUnit; base.material = material; }
void CreateDefaultTechnique() { string sourceFile = "Base\\Shaders\\Water.cg_hlsl"; string vertexSyntax; string fragmentSyntax; { if( RenderSystem.Instance.IsDirect3D() ) { vertexSyntax = "vs_3_0"; fragmentSyntax = "ps_3_0"; } else if( RenderSystem.Instance.IsOpenGLES() ) { vertexSyntax = "hlsl2glsl"; fragmentSyntax = "hlsl2glsl"; } else { vertexSyntax = "arbvp1"; fragmentSyntax = "arbfp1"; } } BaseMaterial.ReceiveShadows = false; Technique tecnhique = BaseMaterial.CreateTechnique(); Pass pass = tecnhique.CreatePass(); bool transparent = owner.DeepColor.Alpha != 1 || owner.ShallowColor.Alpha != 1; //generate compileArguments and bind textures StringBuilder compileArguments = new StringBuilder( 128 ); //general settings if( RenderSystem.Instance.IsDirect3D() ) compileArguments.Append( " -DDIRECT3D" ); if( RenderSystem.Instance.IsOpenGL() ) compileArguments.Append( " -DOPENGL" ); if( RenderSystem.Instance.IsOpenGLES() ) compileArguments.Append( " -DOPENGL_ES" ); if( !transparent ) compileArguments.Append( " -DDEPTH_WRITE" ); //transparent surface if( transparent ) { pass.SourceBlendFactor = SceneBlendFactor.SourceAlpha; pass.DestBlendFactor = SceneBlendFactor.OneMinusSourceAlpha; pass.DepthWrite = false; compileArguments.Append( " -DTRANSPARENT" ); } //disable Direct3D standard fog features pass.SetFogOverride( FogMode.None, new ColorValue( 0, 0, 0 ), 0, 0, 0 ); //Fog if( owner.AllowFog ) { FogMode fogMode = SceneManager.Instance.GetFogMode(); if( fogMode != FogMode.None ) { compileArguments.Append( " -DFOG_ENABLED" ); compileArguments.Append( " -DFOG_" + fogMode.ToString().ToUpper() ); } } //noiseMap { TextureUnitState state = pass.CreateTextureUnitState(); state.SetTextureName( "Base\\Types\\Water Plane\\WaterNoise.dds", Texture.Type.Type2D ); } //reflectionMap if( owner.ReflectionLevel != WaterPlane.ReflectionLevels.None && RenderSystem.Instance.Capabilities.HardwareRenderToTexture ) { compileArguments.Append( " -DREFLECTION_MAP" ); reflectionMapState = pass.CreateTextureUnitState(); reflectionMapState.SetTextureAddressingMode( TextureAddressingMode.Clamp ); reflectionMapState.SetTextureFiltering( FilterOptions.Linear, FilterOptions.Linear, FilterOptions.None ); } //vertex program { string errorString; GpuProgram program = GpuProgramCacheManager.Instance.AddProgram( "WaterPlane_Vertex_", GpuProgramType.Vertex, sourceFile, "main_vp", vertexSyntax, compileArguments.ToString(), out errorString ); if( !string.IsNullOrEmpty( errorString ) ) Log.Fatal( errorString ); if( program != null ) { GpuProgramParameters parameters = program.DefaultParameters; SetProgramAutoConstants( parameters ); pass.VertexProgramName = program.Name; } } //fragment program { string errorString; GpuProgram program = GpuProgramCacheManager.Instance.AddProgram( "WaterPlane_Fragment_", GpuProgramType.Fragment, sourceFile, "main_fp", fragmentSyntax, compileArguments.ToString(), out errorString ); if( !string.IsNullOrEmpty( errorString ) ) Log.Fatal( errorString ); if( program != null ) { SetProgramAutoConstants( program.DefaultParameters ); pass.FragmentProgramName = program.Name; } } }