internal override IEnumerable <SceneObjectBatch> GetGeometries(GraphicsContext ctx, SceneGraphContext ctxScene) { if ((ctxScene.Scene.SceneFlags & SceneGraphFlags.BoundingVolumes) != 0) { GraphicsStateSet boundingVolumeState = ctxScene.GraphicsStateStack.Current.Push(); // Transform TransformStateBase boundingVolumeModel = (TransformStateBase)boundingVolumeState[TransformStateBase.StateSetIndex]; float lightVolumeDepth = 100.0f; float lightVolumeSize = lightVolumeDepth * (float)Math.Tan(Angle.ToRadians(FalloffAngle)); boundingVolumeModel.LocalModelViewProjection.Set(boundingVolumeModel.LocalModelViewProjection.Multiply(LightMatrix)); boundingVolumeModel.LocalModelViewProjection.Translate(0.0f, 0.0f, lightVolumeDepth); boundingVolumeModel.LocalModelViewProjection.Scale(lightVolumeSize, lightVolumeSize, lightVolumeDepth); // Uniform color ShaderUniformState uniformState = new ShaderUniformState("UniformState"); uniformState.SetUniformState("glo_UniformColor", new ColorRGBAF(1.0f, 1.0f, 0.0f, 0.5f)); boundingVolumeState.DefineState(uniformState); // Alpha blending boundingVolumeState.DefineState(BlendState.AlphaBlending); yield return(new SceneObjectBatch( _BoundingVolumeArrays, boundingVolumeState, _BoundingVolumeProgram )); } yield break; }
private SceneObject CreateSkyBoxObject() { if (!Gl.CurrentExtensions.TextureCubeMap_ARB) { return(null); } SceneObjectGeometry skyboxObject = new SceneObjectGeometry(); #region Texture OpenGL.Objects.Image[] cubeMap = new OpenGL.Objects.Image[6]; using (Stream imageStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("HelloObjects.Data.PiazzaDelPopolo.posx.jpg")) cubeMap[0] = ImageCodec.Instance.Load(imageStream, ImageFormat.Jpeg); using (Stream imageStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("HelloObjects.Data.PiazzaDelPopolo.negx.jpg")) cubeMap[1] = ImageCodec.Instance.Load(imageStream, ImageFormat.Jpeg); using (Stream imageStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("HelloObjects.Data.PiazzaDelPopolo.posy.jpg")) cubeMap[2] = ImageCodec.Instance.Load(imageStream, ImageFormat.Jpeg); using (Stream imageStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("HelloObjects.Data.PiazzaDelPopolo.negy.jpg")) cubeMap[3] = ImageCodec.Instance.Load(imageStream, ImageFormat.Jpeg); using (Stream imageStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("HelloObjects.Data.PiazzaDelPopolo.posz.jpg")) cubeMap[4] = ImageCodec.Instance.Load(imageStream, ImageFormat.Jpeg); using (Stream imageStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("HelloObjects.Data.PiazzaDelPopolo.negz.jpg")) cubeMap[5] = ImageCodec.Instance.Load(imageStream, ImageFormat.Jpeg); foreach (OpenGL.Objects.Image image in cubeMap) { image.FlipVertically(); } TextureCube cubeMapTexture = new TextureCube(); cubeMapTexture.Create(PixelLayout.RGB24, cubeMap); #endregion #region State skyboxObject.LocalModel.Scale(170.0f); skyboxObject.ObjectState.DefineState(new DepthTestState(DepthFunction.Less)); skyboxObject.ObjectState.DefineState(new CullFaceState(FrontFaceDirection.Cw, CullFaceMode.Back)); ShaderUniformState skyboxUniformState = new ShaderUniformState("OpenGL.Skybox"); skyboxUniformState.SetUniformState("glo_CubeMapTexture", cubeMapTexture); skyboxObject.ObjectState.DefineState(skyboxUniformState); #endregion #region Program skyboxObject.ProgramTag = ShadersLibrary.Instance.CreateProgramTag("OpenGL.Skybox"); skyboxObject.Program.Create(_Context); #endregion #region Vertex Array // Define vertex arrays skyboxObject.VertexArray = new VertexArrayObject(); skyboxObject.VertexArray.SetArray(_CubeArrayPosition, VertexArraySemantic.Position); skyboxObject.VertexArray.SetElementArray(PrimitiveType.Triangles); skyboxObject.VertexArray.Create(_Context); #endregion return(skyboxObject); }