public void drawLines() { //resizeing code adapted from //http://www.ogre3d.org/wiki/index.php/DynamicGrowingBuffers HardwareVertexBufferSharedPtr vbuf; uint newVertCapacity = mVertexBufferCapacity; if (!mDrawn) { mDrawn = true; mVertexBufferCapacity = 0; newVertCapacity = 1; // Make capacity the next power of two while (newVertCapacity < mPoints.Count) { newVertCapacity <<= 1; } mVertexBufferCapacity = newVertCapacity; // Initialization stuff this.RO_IndexData = null; this.RO_UseIndexes = false; mVD.vertexCount = (uint)mPoints.Count; mVD.vertexStart = 0; this.RO_OperationType = OperationType.OT_LINE_STRIP; // OT_LINE_LIST, OT_LINE_STRIP offPos = mVD.vertexDeclaration.addElement( POSITION_BINDING, 0, VertexElementType.VET_FLOAT3, VertexElementSemantic.VES_POSITION).getOffset(); mVertexSize = VertexElement.getTypeSize(VertexElementType.VET_FLOAT3); vbuf = HardwareBufferManager.getSingleton().createVertexBuffer( mVD.vertexDeclaration.getVertexSize(POSITION_BINDING), mVertexBufferCapacity, HardwareBuffer.Usage.HBU_STATIC_WRITE_ONLY); mVD.vertexBufferBinding.setBinding(POSITION_BINDING, vbuf); } if ((mPoints.Count > mVertexBufferCapacity) || (mVertexBufferCapacity == 0)) { // vertexCount exceeds current capacity! // It is necessary to reallocate the buffer. // Check if this is the first call... should never happen(we have mDrawn flag check) if (newVertCapacity == 0) { newVertCapacity = 1; } // Make capacity the next power of two while (newVertCapacity < mPoints.Count) { newVertCapacity <<= 1; } } else if (mPoints.Count < (mVertexBufferCapacity >> 1)) { // Make capacity the previous power of two while (mPoints.Count < (newVertCapacity >> 1)) { newVertCapacity >>= 1; } } if (newVertCapacity != mVertexBufferCapacity) { mVertexBufferCapacity = newVertCapacity; mVD.vertexCount = mVertexBufferCapacity; // Create new vertex buffer vbuf = HardwareBufferManager.getSingleton().createVertexBuffer( mVD.vertexDeclaration.getVertexSize(POSITION_BINDING), mVertexBufferCapacity, HardwareBuffer.Usage.HBU_STATIC_WRITE_ONLY); //the old buffer will automatically be deleted once no more references to it exist //http://www.ogre3d.org/phpBB2/viewtopic.php?t=13058&highlight=vertexbuffer+update // Bind buffer mVD.vertexBufferBinding.setBinding(POSITION_BINDING, vbuf); } else { //we need to set vbuf vbuf = mVD.vertexBufferBinding.getBuffer(POSITION_BINDING); } // Update vertex count in the render operation mVD.vertexCount = (uint)mPoints.Count; // Drawing stuff int size = mPoints.Count; Vector3 vaabMin = (Math3D.Vector3)mPoints[0]; Vector3 vaabMax = (Math3D.Vector3)mPoints[0]; IntPtr ptrBuff = vbuf.Get().Lock(HardwareBuffer.LockOptions.HBL_DISCARD); for (int i = 0; i < size; i++) { MeshBuilderHelper.SetVertexFloat(ptrBuff, mVertexSize, (uint)i, offPos, ((Math3D.Vector3)mPoints[i]).x, ((Math3D.Vector3)mPoints[i]).y, ((Math3D.Vector3)mPoints[i]).z); if (((Math3D.Vector3)mPoints[i]).x < vaabMin.x) { vaabMin.x = ((Math3D.Vector3)mPoints[i]).x; } if (((Math3D.Vector3)mPoints[i]).y < vaabMin.y) { vaabMin.y = ((Math3D.Vector3)mPoints[i]).y; } if (((Math3D.Vector3)mPoints[i]).z < vaabMin.z) { vaabMin.z = ((Math3D.Vector3)mPoints[i]).z; } if (((Math3D.Vector3)mPoints[i]).x > vaabMax.x) { vaabMax.x = ((Math3D.Vector3)mPoints[i]).x; } if (((Math3D.Vector3)mPoints[i]).y > vaabMax.y) { vaabMax.y = ((Math3D.Vector3)mPoints[i]).y; } if (((Math3D.Vector3)mPoints[i]).z > vaabMax.z) { vaabMax.z = ((Math3D.Vector3)mPoints[i]).z; } } vbuf.Get().Unlock(); AxisAlignedBox box = this.CallBase_getBoundingBox(); box.SetExtents(vaabMin, vaabMax); }
public myBillBoardChain(Camera vCamera, int maxNbChainElements) : base() { Init_Event_NotifyCurrentCamera(); Init_Event_GetSquaredViewDepth(); Init_Event_GetBoundingRadius(); evtNotifyCurrentCamera += new SRD_Delegate_notifyCurrentCamera(event_notifyCurrentCamera); evtGetSquaredViewDepth += new SRD_Delegate_getSquaredViewDepth(event_getSquaredViewDepth); evtGetBoundingRadius += new SRD_Delegate_getBoundingRadius(event_getBoundingRadius); mCamera = vCamera; mChainElementList = new ArrayList(); mRadius = 0.0f; mMaxNbChainElements = maxNbChainElements; mVD = new VertexData(); this.RO_VertexData = mVD; this.RO_IndexData = null; mVD.vertexCount = (uint)0; mVD.vertexStart = 0; this.RO_OperationType = OperationType.OT_TRIANGLE_STRIP; this.RO_UseIndexes = false; mVBPostOff = 0; mVBVertexSize = 0; mVCBrgbaOff = 0; mVCBVertexSize = 0; mTCBuvOff = 0; mTCVertexSize = 0; //---------- // Add a description for the buffer of the positions of the vertices mVBPostOff = mVD.vertexDeclaration.addElement(POSITION_BINDING, 0, VertexElementType.VET_FLOAT3, VertexElementSemantic.VES_POSITION).getOffset(); mVBVertexSize += VertexElement.getTypeSize(VertexElementType.VET_FLOAT3); // Create the buffer HardwareVertexBufferSharedPtr pVertexBuffer = HardwareBufferManager.getSingleton().createVertexBuffer( mVD.vertexDeclaration.getVertexSize(POSITION_BINDING), (uint)(mMaxNbChainElements * 2), HardwareBuffer.Usage.HBU_STATIC_WRITE_ONLY); // Bind the buffer mVD.vertexBufferBinding.setBinding(POSITION_BINDING, pVertexBuffer); //---------- // Add a description for the buffer of the diffuse color of the vertices mVCBrgbaOff = mVD.vertexDeclaration.addElement(DIFFUSE_COLOR_BINDING, 0, VertexElementType.VET_FLOAT4, VertexElementSemantic.VES_DIFFUSE).getOffset(); mVCBVertexSize += VertexElement.getTypeSize(VertexElementType.VET_FLOAT4); // Create the buffer HardwareVertexBufferSharedPtr pVertexColorBuffer = HardwareBufferManager.getSingleton().createVertexBuffer( mVD.vertexDeclaration.getVertexSize(DIFFUSE_COLOR_BINDING), (uint)(mMaxNbChainElements * 2), HardwareBuffer.Usage.HBU_STATIC_WRITE_ONLY); // Bind the buffer mVD.vertexBufferBinding.setBinding(DIFFUSE_COLOR_BINDING, pVertexColorBuffer); //---------- // Add a description for the buffer of the texture coordinates of the vertices mTCBuvOff = mVD.vertexDeclaration.addElement(TEXCOORD_BINDING, 0, VertexElementType.VET_FLOAT2, VertexElementSemantic.VES_TEXTURE_COORDINATES).getOffset(); mTCVertexSize += VertexElement.getTypeSize(VertexElementType.VET_FLOAT2); // Create the buffer HardwareVertexBufferSharedPtr pTexCoordBuffer = HardwareBufferManager.getSingleton().createVertexBuffer( mVD.vertexDeclaration.getVertexSize(TEXCOORD_BINDING), (uint)(mMaxNbChainElements * 2), HardwareBuffer.Usage.HBU_STATIC_WRITE_ONLY); // Bind the buffer mVD.vertexBufferBinding.setBinding(TEXCOORD_BINDING, pTexCoordBuffer); // set basic white material this.setMaterial("BaseWhiteNoLighting"); }
/// <summary> /// createGrassMesh /// This demonstrates how to create a manual mesh /// only use static members of MeshBuilderHelper to help set vertex and index data. /// </summary> void createGrassMesh() { OgreDotNet.MeshPtr mp = MeshManager.Instance.CreateManual(GRASS_MESH_NAME, "General"); SubMesh sm = mp.Get().CreateSubMesh(); sm.useSharedVertices = false; sm.vertexData = new VertexData(); sm.vertexData.vertexStart = 0; sm.vertexData.vertexCount = 12; //mIndexType = HardwareIndexBuffer::IT_16BIT; VertexDeclaration dcl = sm.vertexData.vertexDeclaration; UInt32 offset = 0; UInt32 offPos = dcl.addElement(0, offset, VertexElementType.VET_FLOAT3, VertexElementSemantic.VES_POSITION).getOffset(); offset = VertexElement.getTypeSize(VertexElementType.VET_FLOAT3); UInt32 offNorm = dcl.addElement(0, offset, VertexElementType.VET_FLOAT3, VertexElementSemantic.VES_NORMAL).getOffset(); offset += VertexElement.getTypeSize(VertexElementType.VET_FLOAT3); UInt32 offUV = dcl.addElement(0, offset, VertexElementType.VET_FLOAT2, VertexElementSemantic.VES_TEXTURE_COORDINATES).getOffset(); offset += VertexElement.getTypeSize(VertexElementType.VET_FLOAT2); UInt32 vertexsize = offset; mLog.LogMessage(string.Format("createGrassMesh vertexsize={0}", vertexsize)); HardwareVertexBufferSharedPtr vbuf = HardwareBufferManager.getSingleton().createVertexBuffer( vertexsize, 12, HardwareBuffer.Usage.HBU_STATIC_WRITE_ONLY); IntPtr pV = vbuf.Get().Lock(HardwareBuffer.LockOptions.HBL_DISCARD); Vector3 vec = new Vector3(GRASS_WIDTH / 2.0f, 0.0f, 0.0f); Quaternion rot = Quaternion.FromAngleAxis(60, Vector3.UnitY); uint i; for (i = 0; i < 3; ++i) { OgreDotNet.MeshBuilderHelper.SetVertexFloat(pV, vertexsize, (i * 4) + 0, offPos, -vec.x, GRASS_HEIGHT, -vec.z); //position OgreDotNet.MeshBuilderHelper.SetVertexFloat(pV, vertexsize, (i * 4) + 0, offNorm, 0.0f, 1.0f, 0.0f); //normal OgreDotNet.MeshBuilderHelper.SetVertexFloat(pV, vertexsize, (i * 4) + 0, offUV, 0.0f, 0.0f); //uv OgreDotNet.MeshBuilderHelper.SetVertexFloat(pV, vertexsize, (i * 4) + 1, offPos, vec.x, GRASS_HEIGHT, vec.z); //position OgreDotNet.MeshBuilderHelper.SetVertexFloat(pV, vertexsize, (i * 4) + 1, offNorm, 0.0f, 1.0f, 0.0f); //normal OgreDotNet.MeshBuilderHelper.SetVertexFloat(pV, vertexsize, (i * 4) + 1, offUV, 1.0f, 0.0f); //uv OgreDotNet.MeshBuilderHelper.SetVertexFloat(pV, vertexsize, (i * 4) + 2, offPos, -vec.x, 0.0f, -vec.z); //position OgreDotNet.MeshBuilderHelper.SetVertexFloat(pV, vertexsize, (i * 4) + 2, offNorm, 0.0f, 1.0f, 0.0f); //normal OgreDotNet.MeshBuilderHelper.SetVertexFloat(pV, vertexsize, (i * 4) + 2, offUV, 0.0f, 1.0f); //uv OgreDotNet.MeshBuilderHelper.SetVertexFloat(pV, vertexsize, (i * 4) + 3, offPos, vec.x, 0.0f, vec.z); //position OgreDotNet.MeshBuilderHelper.SetVertexFloat(pV, vertexsize, (i * 4) + 3, offNorm, 0.0f, 1.0f, 0.0f); //normal OgreDotNet.MeshBuilderHelper.SetVertexFloat(pV, vertexsize, (i * 4) + 3, offUV, 1.0f, 1.0f); //uv vec = rot * vec; } vbuf.Get().Unlock(); sm.vertexData.vertexBufferBinding.setBinding(0, vbuf); sm.indexData.indexCount = 6 * 3; sm.indexData.indexBuffer = HardwareBufferManager.getSingleton().createIndexBuffer( HardwareIndexBuffer.IndexType.IT_16BIT, 6 * 3, HardwareBuffer.Usage.HBU_STATIC_WRITE_ONLY); IntPtr pI = sm.indexData.indexBuffer.Get().Lock(HardwareBuffer.LockOptions.HBL_DISCARD); for (i = 0; i < 3; ++i) { UInt16 off = (UInt16)(i * 4); OgreDotNet.MeshBuilderHelper.SetIndex16bit(pI, (i * 2) + 0, (UInt16)(0 + off), (UInt16)(3 + off), (UInt16)(1 + off)); OgreDotNet.MeshBuilderHelper.SetIndex16bit(pI, (i * 2) + 1, (UInt16)(0 + off), (UInt16)(2 + off), (UInt16)(3 + off)); } sm.indexData.indexBuffer.Get().Unlock(); sm.SetMaterialName(GRASS_MATERIAL); mp.Get().Load(); }