private static List <BufferObject> CreateBuffers(Gltf gltf)
        {
            var glBuffers   = new List <BufferObject>();
            var byteBuffers = new List <byte[]>();

            foreach (var buffer in gltf.Buffers)
            {
                byteBuffers.Add(ReadBuffer(buffer));
            }
            foreach (var bufferView in gltf.BufferViews)
            {
                if (bufferView.Target.HasValue)
                {
                    var bufferGL    = new BufferObject((BufferTarget)bufferView.Target);
                    var pinnedArray = GCHandle.Alloc(byteBuffers[bufferView.Buffer], GCHandleType.Pinned);
                    var intPtr      = pinnedArray.AddrOfPinnedObject() + bufferView.ByteOffset;
                    bufferGL.Set(intPtr, bufferView.ByteLength, BufferUsageHint.StaticDraw);
                    pinnedArray.Free();
                    glBuffers.Add(bufferGL);
                }
                else
                {
                    glBuffers.Add(null);
                }
            }
            return(glBuffers);
        }
        /// <summary>
        /// given color and depth textures, render them.
        /// </summary>
        public static RenderPass CreateSolidBox(
			 TextureBase depth_texture,
			 BufferObject<Vector4> sprite_pos_buffer,
			 BufferObject<Vector4> sprite_color_buffer,
			 BufferObject<Vector4> sprite_dimensions_buffer,
			 BufferObject<Matrix4> sprite_rotation_local_buffer,
			 BufferObject<Matrix4> sprite_rotation_buffer,
			 IValueProvider<int> particles_count,
				IValueProvider<float> particle_scale_factor,
				IValueProvider<string> fragdepthroutine,
			 ModelViewProjectionParameters mvp
		)
        {
            var viewport = ValueProvider.Create (() => new Vector2 (depth_texture.Width, depth_texture.Height));
            var outputroutine = ValueProvider.Create (() => "SetOutputsNone");
            return CreateSolidBox
            (
                 new FramebufferBindingSet(
                  new DrawFramebufferBinding { Attachment = FramebufferAttachment.DepthAttachment, Texture = depth_texture }
                 ),
                 sprite_pos_buffer, sprite_color_buffer, sprite_dimensions_buffer, sprite_rotation_local_buffer, sprite_rotation_buffer,
                 viewport,
                 particles_count, particle_scale_factor, fragdepthroutine, outputroutine,
                 mvp,
                 null,
                 null
            );
        }
        /*
        /// <summary>
        /// given color and depth textures, render them.
        /// </summary>
        public static RenderPass CreateSolidSphere
        (
             TextureBase normal_depth_target,
             TextureBase uv_colorindex_target,
             TextureBase depth_texture,
             BufferObject<Vector4> sprite_pos_buffer,
             BufferObject<Vector4> sprite_color_buffer,
             BufferObject<Vector4> sprite_dimensions_buffer,
             IValueProvider<int> particles_count,
             IValueProvider<float> particle_scale_factor,
             ModelViewProjectionParameters mvp,
             UniformState subroutineMapping,
             IEnumerable<Shader> subroutines
        )
        {
            var viewport = ValueProvider.Create (() => new Vector2 (depth_texture.Width, depth_texture.Height));
            var mode = ValueProvider.Create (() => 0);

            return CreateSolidSphere
            (
                 new FramebufferBindingSet(
                  new DrawFramebufferBinding { Attachment = FramebufferAttachment.DepthAttachment, Texture = depth_texture },
                  new DrawFramebufferBinding { VariableName = "Fragdata.uv_colorindex_none", Texture = uv_colorindex_target },
                  new DrawFramebufferBinding { VariableName = "Fragdata.normal_depth", Texture = normal_depth_target }
                 ),
                 sprite_pos_buffer, sprite_color_buffer, sprite_dimensions_buffer,
                 viewport,
                 particles_count, particle_scale_factor, mode,
                 mvp,
                 subroutineMapping,
                 subroutines
            );
        }*/
        /// <summary>
        /// given color and depth textures, render them.
        /// </summary>
        public static RenderPass CreateSolidSphere(
			 TextureBase normal_depth_target,
			 TextureBase uv_colorindex_target,
			 TextureBase depth_texture,
			 BufferObject<Vector4> sprite_pos_buffer,
			 BufferObject<Vector4> sprite_color_buffer,
			 BufferObject<Vector4> sprite_dimensions_buffer,
			 IValueProvider<int> particles_count,
			 IValueProvider<float> particle_scale_factor,
			 ModelViewProjectionParameters mvp
		)
        {
            var viewport = ValueProvider.Create (() => new Vector2 (depth_texture.Width, depth_texture.Height));
            var fragdepthroutine = ValueProvider.Create (() => "FragDepthDefault");
            var outputroutine = ValueProvider.Create (() => "SetOutputsDefault");

            return CreateSolidSphere
            (
                 new FramebufferBindingSet(
                  new DrawFramebufferBinding { Attachment = FramebufferAttachment.DepthAttachment, Texture = depth_texture },
                  new DrawFramebufferBinding { VariableName = "uv_colorindex_none", Texture = uv_colorindex_target },
                  new DrawFramebufferBinding { VariableName = "normal_depth", Texture = normal_depth_target }
                 ),
                 sprite_pos_buffer, sprite_color_buffer, sprite_dimensions_buffer,
                 viewport,
                 particles_count, particle_scale_factor, fragdepthroutine, outputroutine,
                 mvp,
                 null,
                 null
            );
        }
Exemple #4
0
        /// <summary>
        /// Create a <see cref="ArrayBufferObjectBase"/> for testing.
        /// </summary>
        /// <returns>
        /// It returns the <see cref="ArrayBufferObjectBase"/> instance to test.
        /// </returns>
        private void CreateGpuInstance(BufferObject buffer)
        {
            if (buffer.GetType() == typeof(ArrayBufferObject))
            {
                ArrayBufferObject arrayBufferObject = (ArrayBufferObject)buffer;

                arrayBufferObject.Create(_Context, CreateTestArray());
            }
            else if (buffer.GetType() == typeof(ElementBufferObject))
            {
                ElementBufferObject elementBufferObject = (ElementBufferObject)buffer;

                elementBufferObject.Create(_Context, CreateTestArray());
            }
            else if (buffer.GetType() == typeof(ArrayBufferObjectInterleaved))
            {
                ArrayBufferObjectInterleaved arrayBufferObjectInterleaved = (ArrayBufferObjectInterleaved)buffer;

                arrayBufferObjectInterleaved.Create(_Context, CreateTestArray());
            }
            else if (buffer.GetType() == typeof(ArrayBufferObjectPacked))
            {
                ArrayBufferObjectPacked arrayBufferObjectPacked = (ArrayBufferObjectPacked)buffer;

                arrayBufferObjectPacked.Create(_Context, CreateTestArray());
            }
        }
Exemple #5
0
        public void SetNonEmptyData()
        {
            var buffer = new BufferObject(BufferTarget.ArrayBuffer);

            buffer.SetData(new float[] { 1, 2, 3 }, BufferUsageHint.StaticDraw);
            Assert.AreEqual(sizeof(float) * 3, buffer.SizeInBytes);
        }
    void Awake()
    {
        cam = GetComponent <Camera>();
        if (cameraSceneMap == null)
        {
            cameraSceneMap = new Dictionary <Camera, BufferObject>();
        }

        if (!cameraSceneMap.ContainsKey(cam))
        {
            BufferObject  entry  = new BufferObject();
            CommandBuffer buffer = new CommandBuffer();
            buffer.name  = "SceneBuffer";
            entry.buffer = buffer;
            cameraSceneMap.Add(cam, entry);
        }

        isolatedCmdBuf      = new CommandBuffer();
        isolatedCmdBuf.name = "IsolatedSceneBuffer";
        easyOutlineMaterial = new Material(Shader.Find("EasyOutline/System"));
        openGLFix           = (SystemInfo.graphicsDeviceType == GraphicsDeviceType.OpenGLES2 || SystemInfo.graphicsDeviceType == GraphicsDeviceType.OpenGLES3 || SystemInfo.graphicsDeviceType == GraphicsDeviceType.OpenGLCore);
        depthMaterial       = new Material(Shader.Find("EasyOutline/RenderDepth"));
        clearColor          = openGLFix ? Color.white : Color.black;
        renTexFmt           = SystemInfo.SupportsRenderTextureFormat(RenderTextureFormat.RFloat) ? RenderTextureFormat.RFloat : RenderTextureFormat.Default;
    }
Exemple #7
0
        public RModel GetRenderModel(RSkeleton skeleton = null)
        {
            var model = new RModel
            {
                BoundingSphere = new Vector4(mesh.BoundingSphereCenter.ToOpenTK(), mesh.BoundingSphereRadius)
            };

            // Use a shared buffer to improve performance.
            // The render meshes will keep references to these objects.
            var vertexBuffer0 = new BufferObject(BufferTarget.ArrayBuffer);

            vertexBuffer0.SetData(mesh.VertexBuffers[0].Buffer, BufferUsageHint.StaticDraw);

            var vertexBuffer1 = new BufferObject(BufferTarget.ArrayBuffer);

            vertexBuffer1.SetData(mesh.VertexBuffers[1].Buffer, BufferUsageHint.StaticDraw);

            foreach (MeshObject meshObject in mesh.Objects)
            {
                var rMesh = new RMesh
                {
                    Name           = meshObject.Name,
                    SubIndex       = meshObject.SubIndex,
                    SingleBindName = meshObject.ParentBoneName,
                    BoundingSphere = new Vector4(meshObject.BoundingSphereCenter.X, meshObject.BoundingSphereCenter.Y,
                                                 meshObject.BoundingSphereCenter.Z, meshObject.BoundingSphereRadius),
                    RenderMesh = CreateRenderMesh(skeleton, meshObject, vertexBuffer0, vertexBuffer1),
                };

                model.SubMeshes.Add(rMesh);
            }

            return(model);
        }
Exemple #8
0
        /// <summary>
        /// sets or updates a vertex attribute of type Matrix4
        /// Matrix4 is stored row-major, but OpenGL expects data to be column-major, so the Matrix4 inputs become transposed in the shader
        /// </summary>
        /// <param name="bindingID">shader binding location</param>
        /// <param name="data">array of Matrix4 inputs</param>
        /// <param name="perInstance">if set to <c>true</c> [per instance].</param>
        private void SetAttribute(int bindingID, Matrix4[] data, bool perInstance = false)
        {
            if (-1 == bindingID)
            {
                return;
            }
            this.Activate();
            BufferObject bufferObject = this.RequestBuffer(bindingID, BufferTarget.ArrayBuffer);

            bufferObject.Set <Matrix4>(data, BufferUsageHint.StaticDraw);
            bufferObject.Activate();
            int num    = Marshal.SizeOf(typeof(Vector4));
            int stride = Marshal.SizeOf(typeof(Matrix4));

            for (int index = 0; index < 4; ++index)
            {
                GL.VertexAttribPointer(bindingID + index, 4, VertexAttribPointerType.Float, false, stride, num * index);
                GL.EnableVertexAttribArray(bindingID + index);
                if (perInstance)
                {
                    GL.VertexAttribDivisor(bindingID + index, 1);
                }
            }
            this.Deactivate();
            GL.BindBuffer(BufferTarget.ArrayBuffer, 0);
            for (int index = 0; index < 4; ++index)
            {
                GL.DisableVertexAttribArray(bindingID + index);
            }
        }
Exemple #9
0
        //protected const int MAXOUTPUTS = 16;
        //protected OperatorOutput[] outputs = new OperatorOutput[MAXOUTPUTS];


        public OperatorComponentBase(bool usingFilenames = true, params Tuple <ShaderType, string>[] shaderSourceOrFilenames)
        {
            Vector3[] vertex =
            {
                new Vector3(-1f,  1f, 0f),
                new Vector3(-1f, -1f, 0f),
                new Vector3(1f,   1f, 0f),
                new Vector3(1f,  -1f, 0f)
            };

            uint[] index =
            {
                0, 1, 2,
                1, 3, 2
            };

            // vertices for OpenGL coordinate space and an identity projection.
            Resources.Add(VertexBuffer = vertex.ToBufferObject("vertex"));

            Resources.Add(IndexBuffer = index.ToBufferObject("index", BufferTarget.ElementArrayBuffer));

            if (shaderSourceOrFilenames != null && shaderSourceOrFilenames.Length > 0)
            {
                Shader = new ReloadableResource <ShaderProgram>("shader", () => new ShaderProgram("shader_internal", "vertex", "", usingFilenames, shaderSourceOrFilenames), (s) => new ShaderProgram(s));

                Resources.Add(Shader);
            }
        }
        public static RModel GetRenderModel(Mesh mesh, RSkeleton skeleton)
        {
            var model = new RModel
            {
                BoundingSphere = new Vector4(mesh.BoundingSphereCenter.ToOpenTK(), mesh.BoundingSphereRadius)
            };

            // Use a shared buffer to improve performance.
            // The render meshes will keep references to these objects.
            var vertexBuffer0 = new BufferObject(BufferTarget.ArrayBuffer);
            vertexBuffer0.SetData(mesh.VertexBuffers[0].Buffer, BufferUsageHint.StaticDraw);

            var vertexBuffer1 = new BufferObject(BufferTarget.ArrayBuffer);
            vertexBuffer1.SetData(mesh.VertexBuffers[1].Buffer, BufferUsageHint.StaticDraw);

            foreach (MeshObject meshObject in mesh.Objects)
            {
                var singleBindIndex = skeleton.GetBoneIndex(meshObject.ParentBoneName);

                var rMesh = new RMesh(meshObject.Name,
                    meshObject.SubIndex,
                    meshObject.ParentBoneName,
                    singleBindIndex,
                    new Vector4(meshObject.BoundingSphereCenter.ToOpenTK(),
                    meshObject.BoundingSphereRadius),
                    CreateRenderMesh(mesh, skeleton, meshObject, vertexBuffer0, vertexBuffer1),
                    // TODO: The actual in game check is more complicated, and involves checking names, subindex, and usage.
                    meshObject.Attributes.Select(m => m.AttributeStrings[0].Text).ToList()
                );

                model.SubMeshes.Add(rMesh);
            }

            return model;
        }
        private static void RenderPresetsToFiles()
        {
            using (GameWindow gameWindow = OpenTKSharedResources.CreateGameWindowContext(width, height))
            {
                // Resource creation.
                screenVbo = ScreenDrawing.CreateScreenQuadBuffer();
                shader    = OpenTKSharedResources.shaders["NudSphere"];

                // Skip thumbnail generation if the shader didn't compile.
                if (!shader.ProgramCreatedSuccessfully)
                {
                    return;
                }

                // HACK: This isn't a very clean way to pass resources around.
                NudMatSphereDrawing.LoadMaterialSphereTextures();
                Dictionary <NUD.DummyTextures, Texture> dummyTextures = RenderTools.CreateNudDummyTextures();

                CreateNudSphereShader();

                foreach (string file in Directory.EnumerateFiles(MainForm.executableDir + "\\materials", "*.nmt", SearchOption.AllDirectories))
                {
                    NUD.Material material   = NUDMaterialEditor.ReadMaterialListFromPreset(file)[0];
                    string       presetName = Path.GetFileNameWithoutExtension(file);
                    RenderMaterialPresetToFile(presetName, material, dummyTextures);
                }
            }
        }
Exemple #12
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="target">The target of the texture or cube face for loading mip maps</param>
        /// <param name="width">The width of the texture or cube map face in pixels</param>
        /// <param name="height">The height of the texture or cube map face in pixels</param>
        /// <param name="baseMipLevel"></param>
        /// <param name="format">The input format and internal format information</param>
        public static void LoadBaseLevelGenerateMipmaps(TextureTarget target, int width, int height,
                                                        BufferObject baseMipLevel, TextureFormatUncompressed format)
        {
            LoadUncompressedMipLevel(target, width, height, baseMipLevel, format, 0);

            GL.GenerateMipmap((GenerateMipmapTarget)target);
        }
Exemple #13
0
 private static void InitializeUVBufferData(BufferObject uvPositionVBO, List <Vector2> uvs)
 {
     // Set up the buffer data.
     uvPositionVBO.Bind();
     Vector2[] uvArray = uvs.ToArray();
     GL.BufferData(uvPositionVBO.BufferTarget, (IntPtr)(sizeof(float) * 2 * uvArray.Length), uvArray, BufferUsageHint.StaticDraw);
 }
        private void InitVBOs()
        {
            // Create vertex and index buffers for our particles.
            // These point to texels in the textures that store particle position and attributes.

            Vector2[] vertex = new Vector2[width * height];
            uint[]    index  = new uint[width * height];

            int i = 0;

            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                {
                    vertex[i] = new Vector2((float)x / (float)width, (float)y / (float)height);
                    index[i]  = (uint)i;
                    i++;
                }
            }

            vertexVBO = new BufferObject <Vector2>("vbuf", BufferTarget.ArrayBuffer, BufferUsageHint.StaticDraw, vertex);
            Resources.Add(vertexVBO);

            indexVBO = new BufferObject <uint>("ibuf", BufferTarget.ElementArrayBuffer, BufferUsageHint.StaticDraw, index);
            Resources.Add(indexVBO);
        }
Exemple #15
0
        public override void Write(byte[] buffer, int offset, int count)
        {
            if (count <= 0)
            {
                return;
            }

            count = Math.Min(buffer.Length - offset, count);

            var tCount    = count;
            var tOffset   = offset;
            var cWriteBuf = _lastBuffer;

            if (cWriteBuf == null)
            {
                _localBuffer.Enqueue(cWriteBuf = _ringBufferProvider.Create());
            }

            while (tCount > 0)
            {
                if (cWriteBuf.IsFull)
                {
                    _localBuffer.Enqueue(cWriteBuf = _ringBufferProvider.Create());
                }

                var cWrite = cWriteBuf.Write(buffer, tOffset, tCount);

                tCount  -= cWrite;
                tOffset += cWrite;
            }

            _lastBuffer = cWriteBuf.IsFull ? null : cWriteBuf;

            _length += count;
        }
Exemple #16
0
 /// <summary>
 /// Test for default values after construction.
 /// </summary>
 /// <param name="buffer"></param>
 private void ConstructionDefaulValues(BufferObject buffer)
 {
     Assert.AreEqual(0U, buffer.BufferSize);
     Assert.AreEqual(0U, buffer.ClientBufferSize);
     Assert.AreEqual(IntPtr.Zero, buffer.GpuBufferAddress);
     Assert.AreEqual(IntPtr.Zero, buffer.ClientBufferAddress);
 }
Exemple #17
0
        private static void LoadFloatTexImageDataPbo(Texture2D floatTexture, Vector3[] pixels, int width, int height)
        {
            BufferObject pixelBuffer = new BufferObject(BufferTarget.PixelUnpackBuffer);

            pixelBuffer.SetData(pixels, BufferUsageHint.StaticDraw);
            floatTexture.LoadImageData(width, height, pixelBuffer, new TextureFormatUncompressed(PixelInternalFormat.Rgb, PixelFormat.Rgb, PixelType.Float));
        }
Exemple #18
0
        unsafe void PrepareState()
        {
            if (m_AttributeState != null)
            {
                UpdateGrid ();
                PositionBuffer.Publish ();
                ParameterBuffer.Publish ();
                m_State.Activate ();
                return;
            }

            m_Count = m_GridDiameter / m_GridDensity + 1;

            unsafe
            {
                PositionBuffer = new BufferObjectCompact<Vector3> (sizeof(Vector3), 4 * m_Count + 2) { Name = "position_buffer", Usage = BufferUsageHint.DynamicDraw };
                ParameterBuffer = new BufferObjectCompact<float> (sizeof(float), 4 * m_Count + 2) { Name = "parameter_buffer", Usage = BufferUsageHint.DynamicDraw };
            }

            m_UniformState = new UniformState ().Set ("modelview_transform", m_CameraMvp.ModelViewProjection);
            m_AttributeState = new ArrayObject (new VertexAttribute { AttributeName = "pos", Buffer = PositionBuffer, Size = 3, Type = VertexAttribPointerType.Float }, new VertexAttribute { AttributeName = "param", Buffer = ParameterBuffer, Size = 1, Type = VertexAttribPointerType.Float });

            m_Program = new Program ("coordinate_grid_program", GetShaders ("GridRenderPass", "").ToArray ());
            m_State = new State (null, m_AttributeState, m_Program, m_UniformState);

            PrepareState ();
        }
Exemple #19
0
        /// <summary>
        /// Sets a vertex attribute array for the given <paramref name="bindingID" />.
        /// </summary>
        /// <typeparam name="DataElement">The data element type.</typeparam>
        /// <param name="bindingID">The binding ID.</param>
        /// <param name="data">The attribute array data.</param>
        /// <param name="type">The array elements base type.</param>
        /// <param name="elementSize">Element count for each array element.</param>
        /// <param name="perInstance">
        /// if set to <c>true</c> attribute array contains one entry for each instance
        /// if set to <c>false</c> all attribute array elements are for one instance
        /// </param>
        private void SetAttribute <DataElement>(
            int bindingID,
            DataElement[] data,
            VertexAttribPointerType type,
            int elementSize,
            bool perInstance = false)
            where DataElement : struct
        {
            if (-1 == bindingID)
            {
                return;
            }
            this.Activate();
            BufferObject bufferObject = this.RequestBuffer(bindingID, BufferTarget.ArrayBuffer);

            bufferObject.Set <DataElement>(data, BufferUsageHint.StaticDraw);
            bufferObject.Activate();
            int stride = Marshal.SizeOf(typeof(DataElement));

            GL.VertexAttribPointer(bindingID, elementSize, type, false, stride, 0);
            GL.EnableVertexAttribArray(bindingID);
            if (perInstance)
            {
                GL.VertexAttribDivisor(bindingID, 1);
            }
            else
            {
                this.lastAttributeLength = data.Length;
            }
            this.Deactivate();
            bufferObject.Deactivate();
            GL.DisableVertexAttribArray(bindingID);
        }
Exemple #20
0
 public HSDScene()
 {
     AttachmentTypes.Remove(typeof(SBMeshList));
     AttachmentTypes.Remove(typeof(SBTextureList));
     AttachmentTypes.Add(typeof(SBDobjAttachment));
     boneBindUniformBuffer      = new BufferObject(BufferTarget.UniformBuffer);
     boneTransformUniformBuffer = new BufferObject(BufferTarget.UniformBuffer);
 }
        public void UncompressedBaseLevel()
        {
            Texture2D    texture     = new Texture2D();
            BufferObject pixelBuffer = new BufferObject(BufferTarget.PixelUnpackBuffer);

            pixelBuffer.SetData(new float[] { 1, 1, 1 }, BufferUsageHint.StaticDraw);
            texture.LoadImageData(1, 1, pixelBuffer, new TextureFormatUncompressed(PixelInternalFormat.Rgb, PixelFormat.Rgb, PixelType.Float));
        }
        public void CompressedBaseLevel()
        {
            Texture2D    texture     = new Texture2D();
            BufferObject pixelBuffer = new BufferObject(BufferTarget.PixelUnpackBuffer);

            pixelBuffer.SetData(new float[] { 1, 1, 1 }, BufferUsageHint.StaticDraw);
            texture.LoadImageData(1, 1, pixelBuffer, InternalFormat.CompressedRgbaS3tcDxt1Ext);
        }
Exemple #23
0
        public static void InitializeUVBufferData(NUD nud)
        {
            // The previous object's data will be cleaned up by GLOBjectManager.
            uvPositionVbo = new BufferObject(BufferTarget.ArrayBuffer);
            uvElementsIbo = new BufferObject(BufferTarget.ElementArrayBuffer);

            nud.UpdateVertexBuffers(uvPositionVbo, uvElementsIbo);
        }
Exemple #24
0
        /// <summary>
        /// Loads texture data of the specified format for the first mip level.
        /// Mipmaps are generated by OpenGL.
        /// </summary>
        /// <param name="width">The width of the base mip level in pixels</param>
        /// <param name="height">The height of the base mip level in pixels</param>
        /// <param name="baseMipLevel">The image data of the first mip level</param>
        /// <param name="format">The image format for all mipmaps</param>
        public void LoadImageData(int width, int height, BufferObject baseMipLevel, TextureFormatUncompressed format)
        {
            Width  = width;
            Height = height;

            Bind();
            MipmapLoading.LoadBaseLevelGenerateMipmaps(TextureTarget, width, height, baseMipLevel, format);
        }
Exemple #25
0
 /// <summary>
 /// Updates the shader buffer.
 /// </summary>
 /// <typeparam name="DATA_ELEMENT_TYPE">The type of the ata element type.</typeparam>
 /// <param name="name">The name.</param>
 /// <param name="uniformArray">The uniform array.</param>
 public void UpdateShaderBuffer <DATA_ELEMENT_TYPE>(string name, DATA_ELEMENT_TYPE[] uniformArray) where DATA_ELEMENT_TYPE : struct
 {
     if (!buffers.TryGetValue(name, out BufferObject buffer))
     {
         buffer = new BufferObject(BufferTarget.ShaderStorageBuffer);
         buffers.Add(name, buffer);
     }
     buffer.Set(uniformArray, BufferUsageHint.StaticCopy);
 }
Exemple #26
0
 private BufferObject RequestBuffer(int bindingID, BufferTarget bufferTarget)
 {
     if (!this.boundBuffers.TryGetValue(bindingID, out var bufferObject))
     {
         bufferObject = new BufferObject(bufferTarget);
         this.boundBuffers[bindingID] = bufferObject;
     }
     return(bufferObject);
 }
Exemple #27
0
 /// <summary>
 /// Updates the uniforms.
 /// </summary>
 /// <typeparam name="DATA">The type of the ata.</typeparam>
 /// <param name="name">The name.</param>
 /// <param name="uniforms">The uniforms.</param>
 public void UpdateUniforms <DATA>(string name, DATA uniforms) where DATA : struct
 {
     if (!buffers.TryGetValue(name, out BufferObject buffer))
     {
         buffer = new BufferObject(BufferTarget.UniformBuffer);
         buffers.Add(name, buffer);
     }
     buffer.Set(uniforms, BufferUsageHint.StaticRead);
 }
Exemple #28
0
        public new void Dispose()
        {
            _lastBuffer = null;
            while (_localBuffer?.Count != 0)
            {
                _localBuffer?.Dequeue().ReIntegrate();
            }

            base.Dispose();
        }
Exemple #29
0
        public static void SetUp()
        {
            // Create the buffer.
            rectangularPrismPositionBuffer = new BufferObject(BufferTarget.ArrayBuffer);
            rectangularPrismPositionBuffer.Bind();

            Vector3[] rectangularPrismPositions = GetRectangularPrismPositions(1, 1, 1);
            GL.BufferData(rectangularPrismPositionBuffer.BufferTarget, (IntPtr)(sizeof(float) * 3 * rectangularPrismPositions.Length),
                          rectangularPrismPositions, BufferUsageHint.StaticDraw);
        }
 public TcpClientChannel()
 {
     ChannelSocket          = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
     _synchronizeHandle     = new AutoResetEvent(false);
     _buffObj               = new BufferObject(_bufferSize = 8192);
     _netWriter             = new NetworkWriter();
     ActiveSocketOperations = new Dictionary <Guid, ISocketOperation>();
     OperationTable         = new Dictionary <int, Type>();
     _lockObj               = new object();
 }
Exemple #31
0
        public Mesh(Vertex[] vertices, int[] indices)
        {
            _vertices = vertices;
            _indices  = indices;

            _vertexArrayObject   = new VertexArrayObject();
            _elementBufferObject = new BufferObject(BufferTarget.ElementArrayBuffer);
            _vertexBufferObject  = new BufferObject(BufferTarget.ArrayBuffer);
            _shader = null;
        }
Exemple #32
0
        public QuadsMesh(GL gl, Layer layer = Layer.Layer0)
        {
            _GL = gl;

            ID                = Guid.NewGuid();
            Visible           = true;
            Layer             = layer;
            BufferObject      = new BufferObject <Quad <TIndex, TVertex> >(gl);
            VertexArrayObject = new VertexArrayObject(gl);
        }
        public static BufferObject CreateScreenQuadBuffer()
        {
            // Create buffer for vertex positions. The data won't change, so only initialize once.
            BufferObject screenQuad = new BufferObject(BufferTarget.ArrayBuffer);

            screenQuad.Bind();
            GL.BufferData(screenQuad.BufferTarget, (IntPtr)(sizeof(float) * screenQuadVertices.Length),
                          screenQuadVertices, BufferUsageHint.StaticDraw);
            return(screenQuad);
        }
        private void InitParticles()
        {
            var rnd = new Random(12);
            Func<float> Rnd01 = () => (float)rnd.NextDouble();
            Func<float> RndCoord = () => (Rnd01() - 0.5f) * 2.0f;
            Func<float> RndSpeed = () => (Rnd01() - 0.5f) * 0.01f;

            bufferParticles = new BufferObject(BufferTarget.ShaderStorageBuffer);

            var data = new Particle[particelCount];
            for (int i = 0; i < particelCount; ++i)
            {
                data[i].position = new Vector2(RndCoord(), RndCoord());
                data[i].velocity = new Vector2(RndSpeed(), RndSpeed());
            }
            bufferParticles.Set(data, BufferUsageHint.StaticCopy);
        }
        public void LoadBufferObject(BufferObject pBufferObject)
        {
            if (pBufferObject == null)
            {
                return;
            }

            if (BufferObjectManager.mBufferObjectsManaged.Contains(pBufferObject))
            {
                /* Just make sure it doesn't get deleted. */
                BufferObjectManager.mBufferObjectsToBeUnloaded.Remove(pBufferObject);
            }
            else
            {
                BufferObjectManager.mBufferObjectsManaged.Add(pBufferObject);
                BufferObjectManager.mBufferObjectsToBeLoaded.Add(pBufferObject);
            }
        }
        unsafe void PrepareState()
        {
            if (m_ParticleRenderingState != null)
            {
                Simulate (DateTime.Now);

                PositionBuffer.Publish ();
                ColorAndSizeBuffer.Publish ();
                m_SystemState.Activate ();
                return;
            }

            unsafe
            {
                //VelocityBuffer = new BufferObject<Vector4> (sizeof(Vector4), size) { Name = "velocity_buffer", Usage = BufferUsageHint.DynamicDraw };
                PositionBuffer = new BufferObject<Vector4> (sizeof(Vector4), PARTICLES_COUNT) { Name = "position_buffer", Usage = BufferUsageHint.DynamicDraw };
                ColorAndSizeBuffer = new BufferObject<Vector4> (sizeof(Vector4), PARTICLES_COUNT) { Name = "colorandsize_buffer", Usage = BufferUsageHint.DynamicDraw };
            }

            m_Projection = new MatrixStack ().Push (Matrix4.CreateOrthographic (14, 14, -1, 1));

            m_TransformationStack = new MatrixStack (m_Projection).Push (Matrix4.Identity).Push (Matrix4.Identity);

            m_UniformState = new UniformState ().Set ("color", new Vector4 (0, 0, 1, 1)).Set ("red", 1.0f).Set ("green", 0.0f).Set ("blue", 1.0f).Set ("colors", new float[] { 0, 1, 0, 1 }).Set ("colors2", new Vector4[] { new Vector4 (1, 0.1f, 0.1f, 0), new Vector4 (1, 0, 0, 0), new Vector4 (1, 1, 0.1f, 0) }).Set ("modelview_transform", m_TransformationStack);

            var sprite = new[] { new Vector3 (-1, -1, 0), new Vector3 (-1, 1, 0), new Vector3 (1, 1, 0), new Vector3 (1, -1, 0) };

            var vdata_buffer = new BufferObject<Vector3> (sizeof(Vector3)) { Name = "vdata_buffer", Usage = BufferUsageHint.DynamicDraw, Data = sprite };

            m_ParticleRenderingState = new ArrayObject (new VertexAttribute { AttributeName = "vertex_pos", Buffer = vdata_buffer, Size = 3, Type = VertexAttribPointerType.Float }, new VertexAttribute { AttributeName = "sprite_pos", Buffer = PositionBuffer, Divisor = 1, Size = 4, Stride = 0, Type = VertexAttribPointerType.Float }, new VertexAttribute { AttributeName = "sprite_colorandsize", Buffer = ColorAndSizeBuffer, Divisor = 1, Size = 4, Type = VertexAttribPointerType.Float });
            m_ParticleRenderingProgram = new Program ("main_program", opentk.ShadingSetup.RenderPass.GetResourceShaders(string.Empty, GetType ().Namespace.Split ('.').Last ()).ToArray ());

            m_SystemState = new State (null, m_ParticleRenderingState, m_ParticleRenderingProgram, m_UniformState);

            var hnd = PositionBuffer.Handle;
            hnd = ColorAndSizeBuffer.Handle;

            m_DebugView = new opentk.QnodeDebug.QuadTreeDebug(10000, m_TransformationStack);
            InitializeSystem();
            PrepareState ();
        }
Exemple #37
0
 protected override void PrepareStateCore()
 {
     unsafe
     {
         MetaBuffer = new BufferObject<MetaInformation> (sizeof(MetaInformation), 0) { Name = "metadata_buffer", Usage = BufferUsageHint.DynamicDraw };
     }
 }
 private void InitializeSystem()
 {
     ColorAndSize = ColorAndSizeBuffer;
     Position = PositionBuffer;
     Oscilation = new Vector2[Position.Length];
     Phase = new float[Position.Length];
     Velocity = new Vector4[Position.Length];
     VelocityUpdate = new Vector4[Position.Length];
     Bmin = new Vector4[Position.Length];
     Bmax = new Vector4[Position.Length];
 }
 public void UnloadBufferObject(BufferObject pBufferObject)
 {
     if (pBufferObject == null)
     {
         return;
     }
     if (BufferObjectManager.mBufferObjectsManaged.Contains(pBufferObject))
     {
         if (BufferObjectManager.mBufferObjectsLoaded.Contains(pBufferObject))
         {
             BufferObjectManager.mBufferObjectsToBeUnloaded.Add(pBufferObject);
         }
         else if (BufferObjectManager.mBufferObjectsToBeLoaded.Remove(pBufferObject))
         {
             BufferObjectManager.mBufferObjectsManaged.Remove(pBufferObject);
         }
     }
 }
        unsafe void PrepareState()
        {
            if (m_AttributeState != null)
            {
                FillBuffers();

                PositionBuffer.Publish ();
                DimensionBuffer.Publish ();
                m_State.Activate ();
                return;
            }

            unsafe
            {
                PositionBuffer = new BufferObjectCompact<Vector3> (sizeof(Vector3), m_MaxSize) { Name = "position_buffer", Usage = BufferUsageHint.DynamicDraw };
                DimensionBuffer = new BufferObjectCompact<Vector3> (sizeof(Vector3), m_MaxSize) { Name = "dimension_buffer", Usage = BufferUsageHint.DynamicDraw };
            }

            m_UniformState = new UniformState ()
                .Set ("modelview_transform", m_TransformationStack);

            m_AttributeState = new ArrayObject (
            new VertexAttribute { AttributeName = "cube_pos", Buffer = PositionBuffer, Size = 3, Type = VertexAttribPointerType.Float },
            new VertexAttribute { AttributeName = "cube_dimensions", Buffer = DimensionBuffer, Size = 3, Type = VertexAttribPointerType.Float });

            m_Program = new Program ("debug_qnode_program", GetShaders("QnodeDebug", "").ToArray ());
            m_State = new State (null, m_AttributeState, m_Program, m_UniformState);

            var hnd = PositionBuffer.Handle;
            hnd = DimensionBuffer.Handle;

            PrepareState ();
        }
        //
        private void PrepareState()
        {
            if (m_Initialized)
            {
                if (PARTICLES_COUNT != m_PositionBuffer.Data.Length)
                {
                    Position = m_PositionBuffer.Data = new Vector4[PARTICLES_COUNT];
                    Dimension = m_DimensionBuffer.Data = new Vector4[PARTICLES_COUNT];
                    Color = m_ColorBuffer.Data = new Vector4[PARTICLES_COUNT];
                    Rotation = m_RotationBuffer.Data = new Matrix4[PARTICLES_COUNT];
                    RotationLocal = m_RotationLocalBuffer.Data = new Matrix4[PARTICLES_COUNT];

                    InitializeSystem ();
                }

                Simulate (DateTime.Now);

                switch (PublishMethod){
                case PublishMethod.AllAtOnce:

                    m_PositionBuffer.Publish ();
                    m_DimensionBuffer.Publish ();
                    m_ColorBuffer.Publish ();
                    m_RotationBuffer.Publish();
                    m_RotationLocalBuffer.Publish();

                    Publish (0, PARTICLES_COUNT);
                    break;
                case PublishMethod.Incremental:
                    {
                      m_PublishCounter %= PARTICLES_COUNT;

                        var start = m_PublishCounter;
                        var end = Math.Min(start + PublishSize, PARTICLES_COUNT);
                        var cnt = end - start;

                        m_PositionBuffer.PublishPart (start, cnt);
                        m_DimensionBuffer.PublishPart (start, cnt);
                        m_ColorBuffer.PublishPart (start, cnt);
                        m_RotationBuffer.PublishPart (start, cnt);
                        m_RotationLocalBuffer.PublishPart (start, cnt);

                      Publish (start, cnt);
                        m_PublishCounter = end;
                    }
                    break;
                default:
                    break;
                }

                return;
            }

            unsafe
            {
                m_PositionBuffer = new BufferObject<Vector4> (sizeof(Vector4), 0) { Name = "position_buffer", Usage = BufferUsageHint.DynamicDraw };
                m_DimensionBuffer = new BufferObject<Vector4> (sizeof(Vector4), 0) { Name = "dimension_buffer", Usage = BufferUsageHint.DynamicDraw };
                m_ColorBuffer = new BufferObject<Vector4> (sizeof(Vector4), 0) { Name = "color_buffer", Usage = BufferUsageHint.DynamicDraw };
                m_RotationBuffer = new BufferObject<Matrix4> (sizeof(Matrix4), 0) { Name = "rotation_buffer", Usage = BufferUsageHint.DynamicDraw };
                m_RotationLocalBuffer = new BufferObject<Matrix4> (sizeof(Matrix4), 0) { Name = "rotation_local_buffer", Usage = BufferUsageHint.DynamicDraw };
            }

            ParticleStateArrayObject =
                new ArrayObject (
                    new VertexAttribute { AttributeName = "sprite_pos", Buffer = m_PositionBuffer, Size = 3, Stride = 16, Type = VertexAttribPointerType.Float },
                    new VertexAttribute { AttributeName = "sprite_color", Buffer = m_ColorBuffer, Size = 3, Stride = 16, Type = VertexAttribPointerType.Float },
                    new VertexAttribute { AttributeName = "sprite_dimensions", Buffer = m_DimensionBuffer, Size = 3, Stride = 16, Type = VertexAttribPointerType.Float },
                    new VertexAttribute { AttributeName = "sprite_rotation_local", Buffer = m_RotationLocalBuffer, Size = 16, Stride = 64, Type = VertexAttribPointerType.Float },
                    new VertexAttribute { AttributeName = "sprite_rotation", Buffer = m_RotationBuffer, Size = 16, Stride = 64, Type = VertexAttribPointerType.Float }
                );

            //
            PublishSize = 100000;
            ModelScaleFactor = 1;

            TransformationStack = new MatrixStack(2);
            ProjectionStack = new MatrixStack(1);
            CameraMvp = new ModelViewProjectionParameters("", TransformationStack, ProjectionStack);

            //
            m_Manip = new OrbitManipulator (ProjectionStack);
            m_Grid = new Grid (CameraMvp);
            TransformationStack[0] = m_Manip.RT;
            TransformationStack.ValueStack[1] = Matrix4.Scale(ModelScaleFactor);

            //
            Uniforms = new UniformState
            {
                {"particle_scale_factor", () => this.ParticleScaleFactor},
                {CameraMvp}
            };

            //
            Shading = GlobalContext.Container.GetExportedValues<IShadingSetup>().FirstOrDefault();
            PrepareStateCore();

            m_Initialized = true;
            PrepareState ();
        }
        public LinuxNativeWindow(IntPtr display, IntPtr gbm, int fd,
            int x, int y, int width, int height, string title,
            GraphicsMode mode, GameWindowFlags options,
            DisplayDevice display_device)
        {
            Debug.Print("[KMS] Creating window on display {0:x}", display);

            Title = title;

            display_device = display_device ?? DisplayDevice.Default;
            if (display_device == null)
            {
                throw new NotSupportedException("[KMS] Driver does not currently support headless systems");
            }

            window = new LinuxWindowInfo(display, fd, gbm, display_device.Id as LinuxDisplay);

            // Note: we only support fullscreen windows on KMS.
            // We implicitly override the requested width and height
            // by the width and height of the DisplayDevice, if any.
            width = display_device.Width;
            height = display_device.Height;
            bounds = new Rectangle(0, 0, width, height);
            client_size = bounds.Size;

            if (!mode.Index.HasValue)
            {
                mode = new EglGraphicsMode().SelectGraphicsMode(window, mode, 0);
            }
            Debug.Print("[KMS] Selected EGL mode {0}", mode);

            SurfaceFormat format = GetSurfaceFormat(display, mode);
            SurfaceFlags usage = SurfaceFlags.Rendering | SurfaceFlags.Scanout;
            if (!Gbm.IsFormatSupported(gbm, format, usage))
            {
                Debug.Print("[KMS] Failed to find suitable surface format, using XRGB8888");
                format = SurfaceFormat.XRGB8888;
            }

            Debug.Print("[KMS] Creating GBM surface on {0:x} with {1}x{2} {3} [{4}]",
                gbm, width, height, format, usage);
            IntPtr gbm_surface =  Gbm.CreateSurface(gbm,
                    width, height, format, usage);
            if (gbm_surface == IntPtr.Zero)
            {
                throw new NotSupportedException("[KMS] Failed to create GBM surface for rendering");
            }

            window.Handle = gbm_surface;
                Debug.Print("[KMS] Created GBM surface {0:x}", window.Handle);

            window.CreateWindowSurface(mode.Index.Value);
            Debug.Print("[KMS] Created EGL surface {0:x}", window.Surface);

            cursor_default = CreateCursor(gbm, Cursors.Default);
            cursor_empty = CreateCursor(gbm, Cursors.Empty);
            Cursor = MouseCursor.Default;
            exists = true;
        }
        public SpriteBatch(TiledTexture tiledTexture, int x, int y, int z, float scaleX, float scaleY)
        {
            bufferObject = new BufferObject();
            Scale = new Vector2(scaleX, scaleY);
            Sprites = new List<Sprite>();
            TiledTexture = tiledTexture;
            X = x;
            Y = y;
            Z = z;

            //Shader
            program = new Program();
            string vertexShader =
            @"
                in vec2 vertex_position;
                in vec2 sprite_position;
                in vec2 tex_position;
                in vec4 vx_color;
                in float rotation;
                in vec2 scale;
                in vec2 size;
                varying vec4 color;
                varying vec2 tex_coord;
                uniform mat4 projection;
                uniform vec2 offset;
                uniform vec2 tile_size;
                uniform mat2 uvTile;

                void main()
                {
                    color = vx_color;

                    float calc_cos = cos(rotation);
                    float calc_sin = sin(rotation);
                    vec2 size_total = size * tile_size * scale;

                    gl_Position =  projection *

                    //Object Translate
                    mat4(
                        vec4(1.0, 0.0, 0.0, 0.0),
                        vec4(0.0, 1.0, 0.0, 0.0),
                        vec4(0.0, 0.0, 1.0, 0.0),
                        vec4(offset + (sprite_position * tile_size) + (size_total * 0.5), 0.0, 1.0)) *

                    //Rotation
                    mat4(
                        vec4(calc_cos, calc_sin, 0.0, 0.0),
                        vec4(-calc_sin, calc_cos, 0.0, 0.0),
                        vec4(0.0, 0.0, 1.0, 0.0),
                        vec4(0.0, 0.0, 0.0, 1.0)) *

                    //Rotation Origin Translate
                    mat4(
                        vec4(1.0, 0.0, 0.0, 0.0),
                        vec4(0.0, 1.0, 0.0, 0.0),
                        vec4(0.0, 0.0, 1.0, 0.0),
                        vec4(size_total * -0.5, 0.0, 1.0)) *

                    //Scale
                    mat4(
                        vec4(size_total.x, 0.0, 0.0, 0.0),
                        vec4(0.0, size_total.y, 0.0, 0.0),
                        vec4(0.0, 0.0, 1.0, 0.0),
                        vec4(0.0, 0.0, 0.0, 1.0)) *

                    vec4(vertex_position, 0.0, 1.0);

                    tex_coord = tex_position + (vertex_position * uvTile * size);
                }
            ";

            string fragShader =
                @"
                varying vec2 tex_coord;
                varying vec4 color;
                uniform sampler2D tex_sampler;

                void main()
                {
                    gl_FragColor = texture2D(tex_sampler, tex_coord).bgra * color;
                }
                ";

            program.AddShader(ShaderType.VertexShader, vertexShader);
            program.AddShader(ShaderType.FragmentShader, fragShader);

            program.SetVariable("offset", new Vector2(X, Y));
            program.SetVariable("tile_size", new Vector2((float)tiledTexture.TileWidth, (float)tiledTexture.TileWidth) * Scale);
            program.SetVariable("uvTile", new Matrix2(tiledTexture.uTile, 0, 0, tiledTexture.vTile));
            program.SetVariable("projection", Projection.Matrix);
            program.SetVariable("tex_sampler", 0);

            Projection.ProjectionChangeEvent += Projection_ProjectionChangeEvent;
        }
        private void InitializeSystem()
        {
            ColorAndSize = ColorAndSizeBuffer;
            Position = PositionBuffer;
            OrigPosition = Position.ToArray ();

            //initialize particle system
            for (int i = 0; i < Position.Length; i++)
            {
                double phi = 2 * Math.PI * i / (double)Position.Length;
                Position[i] = new Vector4 ((float)Math.Cos (phi), (float)Math.Sin (phi), 0, 1);
            }

            Oscilation = new Vector2[Position.Length];
            Phase = new float[Position.Length];
            Velocity = new Vector4[Position.Length];

            System.Random rnd = new Random ();

            for (int i = 0; i < Position.Length; i++)
            {
                Oscilation[i] = new Vector2 ((float)rnd.NextDouble (), (float)rnd.NextDouble ());
                Oscilation[i].Normalize ();
                Phase[i] = (float)rnd.NextDouble ();

                ColorAndSize[i] = 0.1f * new Vector4 (0, 0, 0, (float)rnd.NextDouble ());

                Velocity[i] = new Vector4 (0, 0.01f / (10 * ColorAndSize[i].W), 0, 0);
            }
        }
        public override void Update(IWindowInfo window)
        {
            WaitFlip(true);

            base.SwapBuffers();

            bo = LockSurface();
            int fb = GetFramebuffer(bo);
            SetScanoutRegion(fb);
        }
 internal BufferAllocatedEventArgs(BufferObject buffer, int size)
 {
     Buffer = buffer;
     Size = size;
 }
        static void HandleDestroyFB(BufferObject bo, IntPtr data)
        {
            IntPtr gbm = bo.Device;
            int fb = data.ToInt32();
            Debug.Print("[KMS] Destroying framebuffer {0}", fb);

            if (fb != 0)
            {
                Drm.ModeRmFB(Gbm.DeviceGetFD(gbm), fb);
            }
        }
        int GetFramebuffer(BufferObject bo)
        {
            if (bo == BufferObject.Zero)
                goto fail;

            int bo_handle = bo.Handle;
            if (bo_handle == 0)
            {
                Debug.Print("[KMS] Gbm.BOGetHandle({0:x}) failed.", bo);
                goto fail;
            }

            int width = bo.Width;
            int height = bo.Height;
            int bpp = Mode.ColorFormat.BitsPerPixel;
            int depth = Mode.Depth;
            int stride = bo.Stride;

            if (width == 0 || height == 0 || bpp == 0)
            {
                Debug.Print("[KMS] Invalid framebuffer format: {0}x{1} {2} {3} {4}",
                    width, height, stride, bpp, depth);
                goto fail;
            }

            int buffer;
            int ret = Drm.ModeAddFB(
                fd, width, height,
                (byte)depth, (byte)bpp, stride, bo_handle,
                out buffer);
            if (ret != 0)
            {
                Debug.Print("[KMS] Drm.ModeAddFB({0}, {1}, {2}, {3}, {4}, {5}, {6}) failed. Error: {7}",
                    fd, width, height, depth, bpp, stride, bo_handle, ret);
                goto fail;
            }

            bo.SetUserData((IntPtr)buffer, DestroyFB);
            return buffer;

            fail:
            Debug.Print("[Error] Failed to create framebuffer.");
            return -1;
        }
        void WaitFlip(bool block)
        {
            PollFD fds = new PollFD();
            fds.fd = fd;
            fds.events = PollFlags.In;

            EventContext evctx = new EventContext();
            evctx.version = EventContext.Version;
            evctx.page_flip_handler = PageFlipPtr;

            int timeout = block ? -1 : 0;

            while (is_flip_queued)
            {
                fds.revents = 0;
                if (Libc.poll(ref fds, 1, timeout) < 0)
                    break;

                if ((fds.revents & (PollFlags.Hup | PollFlags.Error)) != 0)
                    break;

                if ((fds.revents & PollFlags.In) != 0)
                    Drm.HandleEvent(fd, ref evctx);
                else
                    break;
            }

            // Page flip has taken place, update buffer objects
            if (!is_flip_queued)
            {
                IntPtr gbm_surface = WindowInfo.Handle;
                Gbm.ReleaseBuffer(gbm_surface, bo);
                bo = bo_next;
            }
        }
        void ISimulationScheme.Simulate(System3 system, DateTime simulationTime, long simulationStep)
        {
            var trailBundleSize = Math.Max(TrailBundleSize, 1);

            if (m_State == null) {
                //create program from resources filtered by namespace and name
                var program = new Program ("SimulationScheme")
                {
                    RenderPass.GetShaders ("System3", "ParticlesWithTrails"),
                    RenderPass.GetShaders ("System3", "PWTSub")
                };
                m_Parameters = new BufferObjectCompact<float>(sizeof(float), 0) { Name = "map_parameters_buffer", Usage = BufferUsageHint.DynamicDraw };

                m_State =
                    new State (null)
                    {
                      program,
                      new ShaderStorageSet
                      {
                            {"Position", system.PositionBuffer},
                          {"Rotation", system.RotationBuffer},
                          {"MapParameters", m_Parameters},
                          {"Dimension", system.DimensionBuffer},
                          {"Attribute1", system.ColorBuffer},
                          {"Meta", system.MetaBuffer},
                      },
                      new UniformState
                      {
                          {"u_Dt", () => (float)system.DT },
                          {"u_TrailSize", () => system.TrailSize },
                          {"u_TrailBundleSize", () => TrailBundleSize },
                          {"u_StepsPerFrame", () => system.StepsPerFrame },
                          {"u_ParticleScale", () => (float)system.ParticleScaleFactor },
                          {"u_Map", (ShaderType)ShaderTypeExt.ComputeShader, () => system.ChaoticMap.Name },
                      }
                    };
            }

            system.MetaBuffer.Publish();
            system.PositionBuffer.Publish();
            system.DimensionBuffer.Publish();
            system.RotationBuffer.Publish();
            system.ColorBuffer.Publish();
            system.RotationLocalBuffer.Publish();

            m_Parameters.Length = system.ChaoticMap.a.Length;
            m_Parameters.CopyFrom(system.ChaoticMap.a, 0);
            m_Parameters.Publish();

            m_State.Activate ();
            GLExtensions.DispatchCompute (system.PARTICLES_COUNT/(8 * trailBundleSize)  + 1, 1, 1);

            //system.MetaBuffer.Readout();
            //system.PositionBuffer.Readout();
            //system.RotationBuffer.Readout();
            //system.DimensionBuffer.Readout();
            //system.ColorBuffer.Readout();
        }
        void SetCursor(MouseCursor cursor)
        {
            BufferObject bo = default(BufferObject);
            if (cursor == MouseCursor.Default)
            {
                bo = cursor_default;
            }
            else if (cursor == MouseCursor.Empty)
            {
                bo = cursor_empty;
            }
            else
            {
                if (cursor_custom != BufferObject.Zero)
                    cursor_custom.Dispose();
                cursor_custom = CreateCursor(window.BufferManager, cursor);
                bo = cursor_custom;
            }

            // If we failed to create a proper cursor, try falling back
            // to the empty cursor. We do not want to crash here!
            if (bo == BufferObject.Zero)
            {
                bo = cursor_empty;
            }

            if (bo != BufferObject.Zero)
            {
                Drm.SetCursor(window.FD, window.DisplayDevice.Id,
                    bo.Handle, bo.Width, bo.Height, cursor.X, cursor.Y);
            }
        }
        /// <summary>
        /// given color and depth textures, render them.
        /// </summary>
        private static RenderPass CreateSolidSphere(
			 FramebufferBindingSet targets,
			 BufferObject<Vector4> sprite_pos_buffer,
			 BufferObject<Vector4> sprite_color_buffer,
			 BufferObject<Vector4> sprite_dimensions_buffer,
			 IValueProvider<Vector2> viewport,
			 IValueProvider<int> particles_count,
			 IValueProvider<float> particle_scale_factor,
			 IValueProvider<string> fragdepthroutine,
			 IValueProvider<string> outputroutine,
			 ModelViewProjectionParameters mvp,
			 UniformState subroutineMapping,
			 IEnumerable<Shader> subroutines
		)
        {
            var uniform_state = subroutineMapping != null? new UniformState (subroutineMapping): new UniformState();
            uniform_state.Set ("viewport_size", viewport);
            uniform_state.Set ("particle_scale_factor", particle_scale_factor);
            uniform_state.Set ("u_SetFragmentDepth", ShaderType.FragmentShader, fragdepthroutine);
            uniform_state.Set ("u_SetOutputs", ShaderType.FragmentShader, outputroutine);
            uniform_state.SetMvp("", mvp);

            var array_state =
                new ArrayObject (
                    new VertexAttribute { AttributeName = "sprite_pos", Buffer = sprite_pos_buffer, Size = 3, Stride = 16, Type = VertexAttribPointerType.Float },
                    new VertexAttribute { AttributeName = "sprite_color", Buffer = sprite_color_buffer, Size = 3, Stride = 16, Type = VertexAttribPointerType.Float },
                    new VertexAttribute { AttributeName = "sprite_dimensions", Buffer = sprite_dimensions_buffer, Size = 3, Stride = 16, Type = VertexAttribPointerType.Float }
                );

            var shaders = SeparateProgramPass.GetShaders("solid_sphere", "RenderPassFactory");
            shaders = shaders.Concat(subroutines ?? new Shader[0]).ToArray();

            //
            var resultPass = new SeparateProgramPass
            (
                 //the name of the pass-program
                 "solid_sphere_RenderPassFactory",
                 //before state
                 null,
                 //before render
                 null,
                 //render code
                 (window) =>
                 {
                    GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
                  GL.Enable (EnableCap.DepthTest);
                    GL.DepthMask(true);
                    GL.DepthFunc (DepthFunction.Less);
                    GL.Disable (EnableCap.Blend);

                    //setup viewport
                    GL.Viewport(0, 0, (int)viewport.Value.X, (int)viewport.Value.Y);
                    GL.DrawArrays (BeginMode.Points, 0, particles_count.Value);
                 },
                 //shaders
                 shaders,

                 //pass state
                 array_state,
                 uniform_state,
                 targets
            );

            return resultPass;
        }
Exemple #53
0
        public Cube()
        {
            Vertices = new Vector3[]
                           {
                               new Vector3(1.0f, -1.0f, -1.0f),
                               new Vector3(1.0f, -1.0f, 1.0f),
                               new Vector3(-1.0f, -1.0f, 1.0f),
                               new Vector3(-1.0f, -1.0f, -1.0f),

                               new Vector3(-1.0f, 1.0f, -1.0f),
                               new Vector3(-1.0f, 1.0f, 1.0f),
                               new Vector3(1.0f, 1.0f, 1.0f),
                               new Vector3(1.0f, 1.0f, -1.0f),

                               new Vector3(-1.0f, -1.0f, -1.0f),
                               new Vector3(-1.0f, -1.0f, 1.0f),
                               new Vector3(-1.0f, 1.0f, 1.0f),
                               new Vector3(-1.0f, 1.0f, -1.0f),

                               new Vector3(1.0f, 1.0f, -1.0f),
                               new Vector3(1.0f, 1.0f, 1.0f),
                               new Vector3(1.0f, -1.0f, 1.0f),
                               new Vector3(1.0f, -1.0f, -1.0f),

                               new Vector3(-1.0f, -1.0f, -1.0f),
                               new Vector3(-1.0f, 1.0f, -1.0f),
                               new Vector3(1.0f, 1.0f, -1.0f),
                               new Vector3(1.0f, -1.0f, -1.0f),

                               new Vector3(1.0f, -1.0f, 1.0f),
                               new Vector3(1.0f, 1.0f, 1.0f),
                               new Vector3(-1.0f, 1.0f, 1.0f),
                               new Vector3(-1.0f, -1.0f, 1.0f)
                           };

            Normals = new Vector3[]
                          {
                              new Vector3(0.0f, -1.0f, 0.0f),
                              new Vector3(0.0f, -1.0f, 0.0f),
                              new Vector3(0.0f, -1.0f, 0.0f),
                              new Vector3(0.0f, -1.0f, 0.0f),

                              new Vector3(0.0f, 1.0f, 0.0f),
                              new Vector3(0.0f, 1.0f, 0.0f),
                              new Vector3(0.0f, 1.0f, 0.0f),
                              new Vector3(0.0f, 1.0f, 0.0f),

                              new Vector3(-1.0f, 0.0f, 0.0f),
                              new Vector3(-1.0f, 0.0f, 0.0f),
                              new Vector3(-1.0f, 0.0f, 0.0f),
                              new Vector3(-1.0f, 0.0f, 0.0f),

                              new Vector3(1.0f, 0.0f, 0.0f),
                              new Vector3(1.0f, 0.0f, 0.0f),
                              new Vector3(1.0f, 0.0f, 0.0f),
                              new Vector3(1.0f, 0.0f, 0.0f),

                              new Vector3(0.0f, 0.0f, -1.0f),
                              new Vector3(0.0f, 0.0f, -1.0f),
                              new Vector3(0.0f, 0.0f, -1.0f),
                              new Vector3(0.0f, 0.0f, -1.0f),

                              new Vector3(0.0f, 0.0f, 1.0f),
                              new Vector3(0.0f, 0.0f, 1.0f),
                              new Vector3(0.0f, 0.0f, 1.0f),
                              new Vector3(0.0f, 0.0f, 1.0f)
                          };

            Colors = new int[]
            {
                ColorToRgba32(Color.DarkRed),
                ColorToRgba32(Color.DarkRed),
                ColorToRgba32(Color.Gold),
                ColorToRgba32(Color.Gold),
                ColorToRgba32(Color.DarkRed),
                ColorToRgba32(Color.DarkRed),
                ColorToRgba32(Color.Gold),
                ColorToRgba32(Color.Gold),
            };

            Texcoords = new Vector2[]
            {
                new Vector2(0, 1),
                new Vector2(1, 1),
                new Vector2(1, 0),
                new Vector2(0, 0),
                new Vector2(0, 1),
                new Vector2(1, 1),
                new Vector2(1, 0),
                new Vector2(0, 0),
            };

            VertexData = new BufferObject<Vector3>(BufferTarget.ArrayBuffer, Vertices);
            NormalData = new BufferObject<Vector3>(BufferTarget.ArrayBuffer, Normals);
            //            IndexData = new BufferObject<int>(BufferTarget.ElementArrayBuffer, Indices);
        }