public static HardwareBufferManager getSingleton()
        {
            HardwareBufferManager ret = new HardwareBufferManager(OgrePINVOKE.HardwareBufferManager_getSingleton(), false);

            if (OgrePINVOKE.SWIGPendingException.Pending)
            {
                throw OgrePINVOKE.SWIGPendingException.Retrieve();
            }
            return(ret);
        }
Exemple #2
0
        /// <summary>
        ///     Clears any of the entities / nodes added to this geometry and
        ///     destroys anything which has already been built.
        /// </summary>
        public void Reset()
        {
            Destroy();
            queuedSubMeshes.Clear();
            subMeshGeometryLookup.Clear();
            HardwareBufferManager bm = HardwareBufferManager.Instance;

            foreach (OptimisedSubMeshGeometry smg in optimisedSubMeshGeometryList)
            {
                bm.DestroyVertexBufferBinding(smg.vertexData.vertexBufferBinding);
                bm.DestroyVertexDeclaration(smg.vertexData.vertexDeclaration);
            }
            optimisedSubMeshGeometryList.Clear();
        }
Exemple #3
0
        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");
        }
 internal static global::System.Runtime.InteropServices.HandleRef getCPtr(HardwareBufferManager obj)
 {
     return((obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr);
 }
Exemple #5
0
        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);
        }
Exemple #6
0
        /// <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();
        }