//////////////////////////////////////////////////////////////////////////////////////////////// /*--------------------------------------------------------------------------------------------*/ public static void BuildBorderMesh(MeshBuilder pMeshBuild, float pWidth, float pHeight, float pThickness) { float innerW = pWidth/2-pThickness; float innerH = pHeight/2-pThickness; float outerW = pWidth/2; float outerH = pHeight/2; BuildHollowRectangleMesh(pMeshBuild, outerW, outerH, innerW, innerH); }
/*--------------------------------------------------------------------------------------------*/ public static void BuildHollowRectangleMesh(MeshBuilder pMeshBuild, float pOuterW, float pOuterH, float pInnerW, float pInnerH) { float halfOuterW = pOuterW/2; float halfOuterH = pOuterH/2; float halfInnerW = pInnerW/2; float halfInnerH = pInnerH/2; float innerUvMaxX = 0.5f + halfInnerW/halfOuterW/2; float innerUvMinX = 0.5f - halfInnerW/halfOuterW/2; float innerUvMaxY = 0.5f + halfInnerH/halfOuterH/2; float innerUvMinY = 0.5f - halfInnerH/halfOuterH/2; pMeshBuild.Resize(8, 24); pMeshBuild.ResetIndices(); pMeshBuild.AddVertex(new Vector3( halfOuterW, halfOuterH, 0)); pMeshBuild.AddVertex(new Vector3( halfOuterW, -halfOuterH, 0)); pMeshBuild.AddVertex(new Vector3(-halfOuterW, -halfOuterH, 0)); pMeshBuild.AddVertex(new Vector3(-halfOuterW, halfOuterH, 0)); pMeshBuild.AddVertex(new Vector3( halfInnerW, halfInnerH, 0)); pMeshBuild.AddVertex(new Vector3( halfInnerW, -halfInnerH, 0)); pMeshBuild.AddVertex(new Vector3(-halfInnerW, -halfInnerH, 0)); pMeshBuild.AddVertex(new Vector3(-halfInnerW, halfInnerH, 0)); pMeshBuild.AddUv(new Vector2(1, 1)); pMeshBuild.AddUv(new Vector2(1, 0)); pMeshBuild.AddUv(new Vector2(0, 0)); pMeshBuild.AddUv(new Vector2(0, 1)); pMeshBuild.AddUv(new Vector2(innerUvMaxX, innerUvMaxY)); pMeshBuild.AddUv(new Vector2(innerUvMaxX, innerUvMinY)); pMeshBuild.AddUv(new Vector2(innerUvMinX, innerUvMinY)); pMeshBuild.AddUv(new Vector2(innerUvMinX, innerUvMaxY)); pMeshBuild.AddTriangle(0, 1, 4); pMeshBuild.AddTriangle(1, 5, 4); pMeshBuild.AddTriangle(1, 2, 5); pMeshBuild.AddTriangle(2, 6, 5); pMeshBuild.AddTriangle(2, 3, 6); pMeshBuild.AddTriangle(3, 7, 6); pMeshBuild.AddTriangle(3, 4, 7); pMeshBuild.AddTriangle(3, 0, 4); }
/*--------------------------------------------------------------------------------------------*/ public static void BuildCircleMesh(MeshBuilder pMeshBuild, float pRadius, int pSteps) { const float angleFull = (float)Math.PI*2; float angleInc = angleFull/pSteps; float angle = 0; pMeshBuild.Resize(pSteps+2, pSteps*3); pMeshBuild.AddVertex(Vector3.zero); pMeshBuild.AddUv(new Vector2(0, 0)); for ( int i = 0 ; i <= pSteps ; ++i ) { pMeshBuild.AddVertex(GetRingPoint(pRadius, angle)); pMeshBuild.AddUv(new Vector2(i/(float)pSteps, 1)); if ( i > 0 ) { int vi = pMeshBuild.VertexIndex; pMeshBuild.AddTriangle(0, vi-2, vi-1); } angle += angleInc; } }
//////////////////////////////////////////////////////////////////////////////////////////////// /*--------------------------------------------------------------------------------------------*/ public static void BuildQuadMesh(MeshBuilder pMeshBuild, float pSizeX=1, float pSizeY=1) { float halfSizeX = pSizeX/2; float halfSizeY = pSizeY/2; pMeshBuild.Resize(4, 6); pMeshBuild.ResetIndices(); pMeshBuild.AddVertex(new Vector3( halfSizeX, halfSizeY, 0)); pMeshBuild.AddVertex(new Vector3( halfSizeX, -halfSizeY, 0)); pMeshBuild.AddVertex(new Vector3(-halfSizeX, -halfSizeY, 0)); pMeshBuild.AddVertex(new Vector3(-halfSizeX, halfSizeY, 0)); pMeshBuild.AddUv(new Vector2(1, 1)); pMeshBuild.AddUv(new Vector2(1, 0)); pMeshBuild.AddUv(new Vector2(0, 0)); pMeshBuild.AddUv(new Vector2(0, 1)); pMeshBuild.AddTriangle(0, 1, 2); pMeshBuild.AddTriangle(0, 2, 3); }
/*--------------------------------------------------------------------------------------------*/ public static void BuildRingMesh(MeshBuilder pMeshBuild, float pInnerRadius, float pOuterRadius, float pAngle0, float pAngle1, int pSteps) { BuildRingMesh(pMeshBuild, pInnerRadius, pOuterRadius, pAngle0, pAngle1, Vector3.zero, Vector3.zero, pSteps); }
/*--------------------------------------------------------------------------------------------*/ public static void BuildRingMesh(MeshBuilder pMeshBuild, float pInnerRadius, float pOuterRadius, float pAngle0, float pAngle1, Vector3 pInnerOffset, Vector3 pOuterOffset, int pSteps) { float angleFull = pAngle1-pAngle0; float angleInc = angleFull/pSteps; float angle = pAngle0; pMeshBuild.Resize((pSteps+1)*2, pSteps*6); pMeshBuild.ResetIndices(); for ( int i = 0 ; i <= pSteps ; ++i ) { float uvx = i/(float)pSteps; pMeshBuild.AddVertex(pInnerOffset+GetRingPoint(pInnerRadius, angle)); pMeshBuild.AddVertex(pOuterOffset+GetRingPoint(pOuterRadius, angle)); pMeshBuild.AddUv(new Vector2(uvx, 0)); pMeshBuild.AddUv(new Vector2(uvx, 1)); if ( i > 0 ) { int vi = pMeshBuild.VertexIndex; pMeshBuild.AddTriangle(vi-3, vi-4, vi-2); pMeshBuild.AddTriangle(vi-1, vi-3, vi-2); } angle += angleInc; } }
/*--------------------------------------------------------------------------------------------*/ public static void BuildRectangleMesh(MeshBuilder pMeshBuild, float pWidth, float pHeight, float pAmount) { float fullW; float fullH; if ( pWidth >= pHeight ) { fullH = pHeight*pAmount; fullW = pWidth-(pHeight-fullH); } else { fullW = pWidth*pAmount; fullH = pHeight-(pWidth-fullW); } float halfW = fullW/2f; float halfH = fullH/2f; pMeshBuild.Resize(4, 6); pMeshBuild.ResetIndices(); pMeshBuild.AddVertex(new Vector3( halfW, halfH, 0)); pMeshBuild.AddVertex(new Vector3( halfW, -halfH, 0)); pMeshBuild.AddVertex(new Vector3(-halfW, -halfH, 0)); pMeshBuild.AddVertex(new Vector3(-halfW, halfH, 0)); pMeshBuild.AddUv(new Vector2(1, 1)); pMeshBuild.AddUv(new Vector2(1, 0)); pMeshBuild.AddUv(new Vector2(0, 0)); pMeshBuild.AddUv(new Vector2(0, 1)); pMeshBuild.AddTriangle(0, 1, 2); pMeshBuild.AddTriangle(0, 2, 3); pMeshBuild.AddRemainingUvs(Vector2.zero); }
/*--------------------------------------------------------------------------------------------*/ protected virtual void CreateMeshBuilder() { vMeshBuild = new MeshBuilder(gameObject.GetComponent<MeshFilter>().sharedMesh); }