public static PackedGeometry Pack(IndexedFaceSet ifs) { PackedGeometry packed; TextureCoordinate texCoordinate; Coordinate coordinate; Color colorNode; ColorRGBA colorRGBANode; packed = new PackedGeometry(); //packed.Texturing = ifs.texCoordinate != null;// || parentShape.texturingEnabled; texCoordinate = (TextureCoordinate)ifs.ChildrenWithAppliedReferences.FirstOrDefault(n => n.GetType() == typeof(TextureCoordinate)); coordinate = (Coordinate)ifs.ChildrenWithAppliedReferences.FirstOrDefault(n => n.GetType() == typeof(Coordinate)); colorNode = (Color)ifs.ChildrenWithAppliedReferences.FirstOrDefault(n => n.GetType() == typeof(Color)); colorRGBANode = (ColorRGBA)ifs.ChildrenWithAppliedReferences.FirstOrDefault(n => n.GetType() == typeof(ColorRGBA)); packed.RGBA = colorRGBANode != null; packed.RGB = colorNode != null; packed.Coloring = packed.RGBA || packed.RGB; packed.generateColorMap = packed.Coloring; if (packed.RGB && !packed.RGBA) { packed.color = X3DTypeConverters.Floats(colorNode.color); } else if (packed.RGBA && !packed.RGB) { packed.color = X3DTypeConverters.Floats(colorRGBANode.color); } if (texCoordinate != null && !string.IsNullOrEmpty(ifs.texCoordIndex)) { packed._texIndices = X3DTypeConverters.ParseIndicies(ifs.texCoordIndex); packed._texCoords = X3DTypeConverters.MFVec2f(texCoordinate.point); packed.Texturing = true; } if (coordinate != null && !string.IsNullOrEmpty(ifs.coordIndex)) { packed._indices = X3DTypeConverters.ParseIndicies(ifs.coordIndex); packed._coords = X3DTypeConverters.MFVec3f(coordinate.point); if (!string.IsNullOrEmpty(ifs.colorIndex)) { packed._colorIndicies = X3DTypeConverters.ParseIndicies(ifs.colorIndex); } if (ifs.coordIndex.Contains(RESTART_INDEX.ToString())) { packed.restartIndex = RESTART_INDEX; } packed.Interleave(); } return(packed); }
public static PackedGeometry Pack(PointSet pointSet) { PackedGeometry packed; Coordinate coordinate; Color colorNode; ColorRGBA colorRGBANode; packed = new PackedGeometry(); coordinate = (Coordinate)pointSet.ChildrenWithAppliedReferences.FirstOrDefault(n => n.GetType() == typeof(Coordinate)); colorNode = (Color)pointSet.ChildrenWithAppliedReferences.FirstOrDefault(n => n.GetType() == typeof(Color)); colorRGBANode = (ColorRGBA)pointSet.ChildrenWithAppliedReferences.FirstOrDefault(n => n.GetType() == typeof(ColorRGBA)); packed.RGBA = colorRGBANode != null; packed.RGB = colorNode != null; packed.Coloring = packed.RGBA || packed.RGB; packed.generateColorMap = packed.Coloring; if (packed.RGB && !packed.RGBA) { packed.color = X3DTypeConverters.Floats(colorNode.color); } else if (packed.RGBA && !packed.RGB) { packed.color = X3DTypeConverters.Floats(colorRGBANode.color); } if (coordinate != null) { packed._coords = X3DTypeConverters.MFVec3f(coordinate.point); packed.restartIndex = null; packed.vertexStride = 1; packed.Interleave(); } return(packed); }
public override void CollectGeometry( RenderingContext rc, out GeometryHandle handle, out BoundingBox bbox, out bool Coloring, out bool Texturing) { List <Vertex> geometry; handle = GeometryHandle.Zero; bbox = BoundingBox.Zero; parentShape = GetParent <Shape>(); colorNode = (Color)this.Children.FirstOrDefault(n => n.GetType() == typeof(Color)); colorRGBANode = (ColorRGBA)this.Children.FirstOrDefault(n => n.GetType() == typeof(ColorRGBA)); texCoordinateNode = (TextureCoordinate)this.Children.FirstOrDefault(n => n.GetType() == typeof(TextureCoordinate)); RGBA = colorRGBANode != null; RGB = colorNode != null; coloring = RGBA || RGB; generateColorMap = coloring; texturing = texCoordinateNode != null || parentShape.texturingEnabled; generateTexCoordMap = texturing; Coloring = coloring; Texturing = texturing; if (RGB && !RGBA) { color = X3DTypeConverters.Floats(colorNode.color); } else if (RGBA && !RGB) { color = X3DTypeConverters.Floats(colorRGBANode.color); } _isLoaded = true; //// //// //// if (construct) { float sx = this.xSpacing; float sz = this.zSpacing; IConstructionSet constructionSet; IPerlinNoiseGenerator perlinProvider; Bitmap largePerlinImage; constructionSet = SceneManager.GetCurrentConstructionSet(); perlinProvider = constructionSet.GetPerlinNoiseProvider(); ElevationGrid generated = constructionSet.ElevationBuilder.BuildHeightmapFromGenerator( rc, perlinProvider, out largePerlinImage, 40, 40, 20, 20, 20); // build a rather large height map largePerlinImage.Dispose(); Color genColorNode = (Color)generated.Children.FirstOrDefault(n => n.GetType() == typeof(Color)); this.RGB = coloring = generateColorMap = true; this.height = generated.height; this.color = X3DTypeConverters.Floats(genColorNode.color); this.colorPerVertex = generated.colorPerVertex; this.normalPerVertex = generated.normalPerVertex; this.Children = generated.Children; this.xSpacing = generated.xSpacing; this.zSpacing = generated.zSpacing; this.xDimension = generated.xDimension; this.zDimension = generated.zDimension; } if (!this._isLoaded) { parentShape = GetParent <Shape>(); texturing = parentShape.texturingEnabled; generateTexCoordMap = texturing && texCoordinateNode == null; this._isLoaded = true; } height_mapping(); bbox = BoundingBox.CalcBoundingBox(this); geometry = BuildElevationGeometryQuads(bbox); Buffering.BufferShaderGeometry(geometry, out handle.vbo4, out handle.NumVerticies4); }
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(); } }
public override void Load() { base.Load(); Keys = X3DTypeConverters.Floats(this.key); }