public void EnableRendering(Vector3 origin) { Vector3[] lineColors; int[] lineIndicies; bboxShader = ShaderCompiler.BuildDefaultShader(); bboxShader.Link(); lineColors = null; lineIndicies = null; lines(LineColor, 12, out lineColors, out lineIndicies); _geo = new Box.BoxGeometry(); _pack = new PackedGeometry(); _pack.Coloring = true; _pack._indices = _geo.Indices; _pack._coords = _geo.Vertices; _pack.color = X3DTypeConverters.Vec3ToFloatArray(lineColors); _pack._colorIndicies = lineIndicies; _pack.restartIndex = -1; _pack.Interleave(); _handle = _pack.CreateHandle(); renderingEnabled = _handle.HasGeometry; InitBoundaryPoints(origin); }
public void IncludeComposedShader(ComposedShader shader) { shader.Link(); shader.Use(); CurrentShader = shader; RefreshDefaultUniforms(shader); if (shader.IsTessellator) { RefreshTessUniforms(shader); } ComposedShaders.Add(shader); }
public override void PreRenderOnce(RenderingContext rc) { base.PreRenderOnce(rc); if (typeof(Text).IsInstanceOfType(geometry)) { // 2D Text Shader, used to apply transparancy. Since alpha blending didnt work transparent background IncludeDefaultShader(ColorReplaceShader.vertexShaderSource, ColorReplaceShader.fragmentShaderSource); } else if (typeof(Sphere).IsInstanceOfType(geometry)) { // TESSELLATION IncludeTesselationShaders(TriangleTessShader.tessControlShader, TriangleTessShader.tessEvalShader, TriangleTessShader.geometryShaderSource); //CurrentShader.SetFieldValue("spherical", 1); } else { CurrentShader = ShaderCompiler.BuildDefaultShader(); } if (ComposedShaders.Any()) { CurrentShader = ComposedShaders.First(); } CurrentShader.Link(); CurrentShader.Use(); CollectMaterials(); RefreshDefaultUniforms(); Geometry(rc); }
public override void Load() { base.Load(); int i; int a, b; PackedGeometry _pack; cubeHandle = GeometryHandle.Zero; innerHandle = GeometryHandle.Zero; outerHandle = GeometryHandle.Zero; generateCube = !(string.IsNullOrEmpty(frontUrl) || string.IsNullOrEmpty(backUrl) || string.IsNullOrEmpty(topUrl) || string.IsNullOrEmpty(bottomUrl) || string.IsNullOrEmpty(leftUrl) || string.IsNullOrEmpty(rightUrl)); //TODO: replace cube sides that arent available with transparent sides generateSkyAndGround = !(string.IsNullOrEmpty(groundColor) || string.IsNullOrEmpty(skyColor) || string.IsNullOrEmpty(groundAngle) || string.IsNullOrEmpty(skyAngle)); // TODO: later render both skydome and skybox together // Alpha values in skybox should provide a way to see through to skydome. // Skycolor sphere should be slightly larger than groundcolor hemisphere // and finally skybox should fit and be smaller than groundcolor hemisphere. if (generateSkyAndGround) { // Sphere // interpolate colors from groundColor and skyColor over hemispheres using specified sky and ground angles this.groundColors = X3DTypeConverters.MFVec3f(groundColor); this.groundAngles = X3DTypeConverters.Floats(groundAngle); this.skyColors = X3DTypeConverters.MFVec3f(skyColor); this.skyAngles = X3DTypeConverters.Floats(skyAngle); // Assign colors with matching angles colors = new Vector3[groundColors.Length + skyColors.Length]; for (i = 0; i < skyColors.Length; i++) { colors[i] = skyColors[i]; } for (i = skyColors.Length; i < skyColors.Length + groundColors.Length; i++) { colors[i] = groundColors[i - skyColors.Length]; } angles = new float[groundAngles.Length + skyAngles.Length + 2]; angles[0] = 0; for (i = 0; i < skyAngles.Length; i++) { angles[i + 1] = skyAngles[i]; } angles[skyAngles.Length + 1] = 0; for (i = 0; i < groundAngles.Length; i++) { angles[i + skyAngles.Length + 2] = 1.5f + groundAngles[i]; } groundDivisor = (1.0f / groundColors.Length) * (float)Math.PI; // how many colors divided over 90 degrees (lower hemisphere) skyDivisor = (1.0f / groundColors.Length) * (float)Math.PI; // how many colors divided over 90 degrees (upper hemisphere) // SKYDOME // outer sphere (sky) scaleSky = Vector3.One * 6.0f; // slightly bigger than ground hemisphere _shaderOuter = ShaderCompiler.ApplyShader(BackgroundShader.vertexShaderSource, // Make use of the BackgroundShader for Skydome Linear Interpolation BackgroundShader.fragmentShaderSource); _shaderOuter.Link(); List <Vertex> geometryOuterSphere = BuildSphereGeometryQuads(60, Vector3.Zero, 1.0f); Buffering.BufferShaderGeometry(geometryOuterSphere, out outerHandle.vbo4, out outerHandle.NumVerticies4); min = Vector3.Zero; max = Vector3.Zero; BoundingBox.CalculateBoundingBox(geometryOuterSphere, out max, out min); bboxOuter = max - min; // inner hemisphere (ground) //scaleGround = Vector3.One * 5.6f; //_shaderInner = ShaderCompiler.ApplyShader(BackgroundShader.vertexShaderSource, // BackgroundShader.fragmentShaderSource); //_shaderInner.Link(); //List<Vertex> geometryInnerHemisphere = BuildHemisphereGeometryQuads(60, new Vector3(0, 0.0f,0), 1.0f, false); //Buffering.BufferShaderGeometry(geometryInnerHemisphere, out innerHandle.vbo4, out innerHandle.NumVerticies4); //min = Vector3.Zero; //max = Vector3.Zero; //BoundingBox.CalculateBoundingBox(geometryInnerHemisphere, out max, out min); //bboxInner = max - min; skydomeTexture = MakeSkydomeTexture(); } if (generateCube) { tex_cube = createCubeMapFromURIs(); // SKYBOX // innermost skybox scaleCube = Vector3.One * 3.1f; _shaderInnerCube = ShaderCompiler.ApplyShader(CubeMapBackgroundShader.vertexShaderSource, CubeMapBackgroundShader.fragmentShaderSource); _shaderInnerCube.Link(); _pack = new PackedGeometry(); _pack._indices = _cube.Indices; _pack._coords = _cube.Vertices; _pack.Texturing = true; //_pack._colorIndicies = _boxGeometry.Colors; _pack._texCoords = _cube.Texcoords; _pack.restartIndex = -1; _pack.Interleave(); // BUFFER GEOMETRY cubeHandle = _pack.CreateHandle(); } }