public override void CollectGeometry(
            RenderingContext rc,
            out GeometryHandle handle,
            out BoundingBox bbox,
            out bool coloring,
            out bool texturing)
        {
            handle    = GeometryHandle.Zero;
            bbox      = BoundingBox.Zero;
            coloring  = false;
            texturing = false;

            parentShape = GetParent <Shape>();

            _pack = new PackedGeometry();
            _pack.restartIndex = -1;
            _pack._indices     = Faces;
            _pack._coords      = Verts;
            _pack.bbox         = BoundingBox.CalculateBoundingBox(Verts);

            _pack.Interleave();

            // BUFFER GEOMETRY
            handle = Buffering.BufferShaderGeometry(_pack);
        }
        private void UpdateString(String text, out BoundingBox bbox)
        {
            Brush  b;
            PointF p;
            Bitmap bmp;

            bbox = BoundingBox.CalculateBoundingBox(text, Font);

            bmp = new Bitmap((int)bbox.Width, (int)bbox.Height);

            bmp.MakeTransparent(BackColor);

            //if(FontStyle.Justify.FirstOrDefault() == "MIDDLE")
            //{
            //p = new PointF((float)Offset.X + (boundingbox.Width / 8.0f), (float)Offset.Y);
            //}
            //else
            //{
            p = new PointF((float)Offset.X, (float)Offset.Y);
            //}



            b = new SolidBrush(ForeColor);

            using (Graphics g2D = Graphics.FromImage(bmp))
            {
                //g2D.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAlias;
                g2D.Clear(BackColor);
                g2D.DrawString(text, Font, b, p, StringFormat.GenericDefault);
            }

            bmp.RotateFlip(RotateFlipType.RotateNoneFlipX);

            ImageTexture texture = ImageTexture.CreateTextureFromImage(bmp, new Rectangle(0, 0, (int)bbox.Width, (int)bbox.Height));

            if (stringTextures.ContainsKey(text))
            {
                stringTextures[text].FreeTexture();
                stringTextures[text].Dispose();

                stringTextures[text] = texture;
            }
            else
            {
                stringTextures.Add(text, texture);
            }
        }
        private IndexedFaceSet ifs2; // without bottom face

        public override void CollectGeometry(
            RenderingContext rc,
            out GeometryHandle handle,
            out BoundingBox bbox,
            out bool Coloring,
            out bool Texturing)
        {
            PackedGeometry        master;
            PackedGeometry        packed1;
            PackedGeometry        packed2;
            List <PackedGeometry> packs;

            handle    = GeometryHandle.Zero;
            bbox      = BoundingBox.Zero;
            Texturing = false;
            Coloring  = false;

            packs = new List <PackedGeometry>();

            if (this.bottom)
            {
                // Cone with bottom face

                packed1 = PackedGeometry.Pack(ifs1);
                packs.Add(packed1);
            }
            else
            {
                // Cone without bottom face

                packed2 = PackedGeometry.Pack(ifs2);
                packs.Add(packed2);
            }

            master = PackedGeometry.InterleavePacks(packs);

            bbox = BoundingBox.CalculateBoundingBox(master);

            // BUFFER GEOMETRY
            handle = Buffering.BufferShaderGeometry(master);
        }
Beispiel #4
0
        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();
            }
        }