Esempio n. 1
0
        /// <summary>Create a random translation matrix.</summary>
        /// <param name="self"></param>
        /// <param name="min"></param>
        /// <param name="max"></param>
        /// <param name="result"></param>
        public static void NextTranslationMatrix4d(this Random self, ref Vector3d min, ref Vector3d max, out Matrix4d result)
        {
            Vector3d amount;

            self.NextVector3dInRange(ref min, ref max, out amount);
            Matrix4d.Translate(ref amount, out result);
        }
Esempio n. 2
0
        /// <summary>
        /// Add fractal brownian motion to the height texture.
        /// </summary>
        /// <param name="strength"></param>
        /// <param name="scale"></param>
        /// <param name="offset"></param>
        /// <param name="octaves"></param>
        /// <param name="lacunarity"></param>
        /// <param name="gain"></param>
        public void FractalBrownianMotion(float strength, float scale, float offset, int octaves, float lacunarity, float gain)
        {
            Program.Uniforms["FractalBrownianMotionLacunarity"].Set(lacunarity);
            Program.Uniforms["FractalBrownianMotionGain"].Set(gain);
            Program.Uniforms["FractalBrownianMotionOctaves"].Set(octaves);
            Program.Uniforms["FractalBrownianMotionOffset"].Set(offset);
            Program.Uniforms["FractalBrownianMotionScale"].Set(scale);
            Program.Uniforms["FractalBrownianMotionStrength"].Set(strength);

            Matrix4d perlinTransform = PerlinTransform;

            PerlinTransform = Matrix4d.Translate(new Vector3d(TerrainBlock.BlockIndex.X * scale, TerrainBlock.BlockIndex.Y * scale, 0)) * PerlinTransform;
            //LoadRandomPerlinTransform();
            ProcessHeightAll("FractalBrownianMotionTechnique");
            PerlinTransform = perlinTransform;
        }
Esempio n. 3
0
        internal void Draw(ref Vector3 viewPoint, ref Matrix4d world, ref Matrix4d view, ref Matrix4d projection)
        {
            Vector3d worldOffset = WorldOffset;
            Matrix4d blockWorld;

            Matrix4d.Translate(ref worldOffset, out blockWorld);
            blockWorld.Multiply(ref world, out blockWorld);

            foreach (TerrainComponent component in Terrain.Components)
            {
                component.OnDrawing(this, ref blockWorld);
            }

            DrawSetParameters("draw", ref blockWorld, ref view, ref projection);
            Draw(terrain.Program, viewPoint, ref blockWorld);
        }
            public ProceduralParameters Build()
            {
                Vector2i detailLevel = new Vector2i(
                    Math.Max(DetailLevel.X + 1, 3),
                    Math.Max(DetailLevel.Y + 1, 3));
                Vector2d inputSpan = MaxInput - MinInput;

                Matrix4d transform = Transform * Matrix4d.Scale(Size) * Matrix4d.Translate(Centre);

                // Write the vertices.
                int vo = Builder.VertexCount;

                for (int y = 0, i = 0; y < detailLevel.Y; y++)
                {
                    for (int x = 0; x < detailLevel.X; x++, i++)
                    {
                        Vector2d input = (new Vector2d(x, y) * inputSpan + MinInput) / (Vector2d)(detailLevel - 1);
                        Vector3d normal;
                        Vector3d position = transform * SurfaceGenerator(ref input, out normal);

                        Vector2d texel = TexelGenerator(ref input, ref position, ref normal);

                        Builder.AddVertex(position);
                        Builder.SetNormal(normal);
                        Builder.SetTexel(texel);
                    }
                }

                // Write the indices.
                for (int y = 0, i = 0; y < detailLevel.Y - 1; y++)
                {
                    int s = vo + y * detailLevel.X, t = s + detailLevel.X;

                    for (int x = 0; x < detailLevel.X - 1; x++, i += 6, s++, t++)
                    {
                        Builder.AddIndices(
                            s, s + 1, t + 1,
                            s, t + 1, t);
                    }
                }

                Builder.FinishPart(Primitive.Triangles, Material ?? new ModelMaterial());
                return(this);
            }
Esempio n. 5
0
        public void ColorByElevationAndTilt(Texture2D texture, Length minimumElevation, Length maximumElevation, Angle maximumTilt)
        {
            Matrix4d transform = Matrix4d.Translate(0, -minimumElevation.InUniversal, 0) * Matrix4d.Scale(1.0 / maximumTilt.InRadians, 1.0 / (maximumElevation - minimumElevation).InUniversal, 1);

            ColorByElevationAndTilt(texture, transform);
        }