//Geometry Setup //BSphere calculator public GLVao setupBSphere(int instance_id) { float radius = 0.5f * (metaData.AABBMIN - metaData.AABBMAX).Length; Vector4 bsh_center = new Vector4(metaData.AABBMIN + 0.5f * (metaData.AABBMAX - metaData.AABBMIN), 1.0f); Matrix4 t_mat = GLMeshBufferManager.getInstanceWorldMat(this, instance_id); bsh_center = bsh_center * t_mat; //Create Sphere vbo return(new Primitives.Sphere(bsh_center.Xyz, radius).getVAO()); }
public void renderBbox(int pass, int instance_id) { if (GLMeshBufferManager.getInstanceOccludedStatus(this, instance_id)) { return; } Matrix4 worldMat = GLMeshBufferManager.getInstanceWorldMat(this, instance_id); //worldMat = worldMat.ClearRotation(); Vector4[] tr_AABB = new Vector4[2]; //tr_AABB[0] = new Vector4(metaData.AABBMIN, 1.0f) * worldMat; //tr_AABB[1] = new Vector4(metaData.AABBMAX, 1.0f) * worldMat; tr_AABB[0] = new Vector4(instanceRefs[instance_id].AABBMIN, 1.0f); tr_AABB[1] = new Vector4(instanceRefs[instance_id].AABBMAX, 1.0f); //tr_AABB[0] = new Vector4(metaData.AABBMIN, 0.0f); //tr_AABB[1] = new Vector4(metaData.AABBMAX, 0.0f); //Generate all 8 points from the AABB float[] verts1 = new float[] { tr_AABB[0].X, tr_AABB[0].Y, tr_AABB[0].Z, tr_AABB[1].X, tr_AABB[0].Y, tr_AABB[0].Z, tr_AABB[0].X, tr_AABB[1].Y, tr_AABB[0].Z, tr_AABB[1].X, tr_AABB[1].Y, tr_AABB[0].Z, tr_AABB[0].X, tr_AABB[0].Y, tr_AABB[1].Z, tr_AABB[1].X, tr_AABB[0].Y, tr_AABB[1].Z, tr_AABB[0].X, tr_AABB[1].Y, tr_AABB[1].Z, tr_AABB[1].X, tr_AABB[1].Y, tr_AABB[1].Z }; //Indices Int32[] indices = new Int32[] { 0, 1, 2, 2, 1, 3, 1, 5, 3, 5, 7, 3, 5, 4, 6, 5, 6, 7, 0, 2, 4, 2, 6, 4, 3, 6, 2, 7, 6, 3, 0, 4, 5, 1, 0, 5 }; //Generate OpenGL buffers int arraysize = sizeof(float) * verts1.Length; int vb_bbox, eb_bbox; GL.GenBuffers(1, out vb_bbox); GL.GenBuffers(1, out eb_bbox); //Upload vertex buffer GL.BindBuffer(BufferTarget.ArrayBuffer, vb_bbox); //Allocate to NULL GL.BufferData(BufferTarget.ArrayBuffer, (IntPtr)(2 * arraysize), (IntPtr)null, BufferUsageHint.StaticDraw); //Add verts data GL.BufferSubData(BufferTarget.ArrayBuffer, (IntPtr)0, (IntPtr)arraysize, verts1); ////Upload index buffer GL.BindBuffer(BufferTarget.ElementArrayBuffer, eb_bbox); GL.BufferData(BufferTarget.ElementArrayBuffer, (IntPtr)(sizeof(Int32) * indices.Length), indices, BufferUsageHint.StaticDraw); //Render GL.BindBuffer(BufferTarget.ArrayBuffer, vb_bbox); GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 0, 0); GL.EnableVertexAttribArray(0); //InverseBind Matrices //loc = GL.GetUniformLocation(shader_program, "invBMs"); //GL.UniformMatrix4(loc, this.vbo.jointData.Count, false, this.vbo.invBMats); //Render Elements GL.PointSize(5.0f); GL.BindBuffer(BufferTarget.ElementArrayBuffer, eb_bbox); GL.DrawRangeElements(PrimitiveType.Triangles, 0, verts1.Length, indices.Length, DrawElementsType.UnsignedInt, IntPtr.Zero); GL.DisableVertexAttribArray(0); GL.DeleteBuffer(vb_bbox); GL.DeleteBuffer(eb_bbox); }