MFloatPointArray ropeGenerator::createHalfRope( int pointsCount, float radius ) { MFloatPointArray points; MPoint baseVector( 1,0,0 ); baseVector = baseVector * radius; points.append( MFloatPoint( baseVector.x, baseVector.y, baseVector.z, 1.0 ) ); float fbaseAngle = 180.0 / float( pointsCount ); for (int d = 1; d < pointsCount; d++) { if (d == 1) { MAngle baseAngle((fbaseAngle * 0.25), MAngle::kDegrees ); MVector vVector( baseVector ); vVector = vVector.rotateBy( MVector::kYaxis, baseAngle.asRadians() ); points.append( MFloatPoint( vVector.x, vVector.y, vVector.z, 1.0 ) ); } MAngle baseAngle((fbaseAngle * float( d ) ), MAngle::kDegrees ); MVector vVector( baseVector ); vVector = vVector.rotateBy( MVector::kYaxis, baseAngle.asRadians() ); points.append( MFloatPoint( vVector.x, vVector.y, vVector.z, 1.0 ) ); if ( d == pointsCount - 1 ) { MAngle baseAngle((fbaseAngle * ( d + 0.75 )), MAngle::kDegrees ); MVector vVector( baseVector ); vVector = vVector.rotateBy( MVector::kYaxis, baseAngle.asRadians() ); points.append( MFloatPoint( vVector.x, vVector.y, vVector.z, 1.0 ) ); } } return points; }
void ropeGenerator::createCircleUvs( int pointsCount, float uvCapSize, MFloatArray &uArray, MFloatArray &vArray, float direction) { MPoint baseVector( 0.5 * uvCapSize,0,0 ); uArray.append( baseVector.x + 0.5 ); vArray.append( baseVector.z + 0.5 ); for ( int d = 1; d < pointsCount; d++ ) { MVector vVector( baseVector ); vVector = vVector.rotateBy( MVector::kYaxis, MAngle(( 360.0 * direction / float( pointsCount )) * float( d ),MAngle::kDegrees).asRadians() ); uArray.append( vVector.x + 0.5 ); vArray.append( vVector.z + 0.5 ); } }
void CoreCircleShape_Imp::DivideToTriangles() { if (numberOfCorners < 3) return; const float radInc = 360.0 / numberOfCorners; const float outerRadius = outerDiameter / 2; const float innerRadius = innerDiameter / 2; float currentPosDeg = angle - 90; float currentUVDeg = -90; Vector2DF baseVector(0, -1); baseVector.SetDegree(currentPosDeg); Vector2DF uvCenter = { 0.5, 0.5 }; Vector2DF uvVector = { 0, -0.5 }; float ratio = innerDiameter / outerDiameter; for (int i = 0; i < numberOfCorners; ++i) { Vector2DF currentPosVector = baseVector; currentPosVector.SetDegree(currentPosDeg); Vector2DF nextPosVector = currentPosVector; auto nextPosDeg = nextPosVector.GetDegree(); nextPosDeg += radInc; nextPosVector.SetDegree(nextPosDeg); Vector2DF currentUVVector = uvVector; currentUVVector.SetDegree(currentUVDeg); Vector2DF nextUVVector = currentUVVector; auto nextUVDeg = nextUVVector.GetDegree(); nextUVDeg += radInc; nextUVVector.SetDegree(nextUVDeg); std::array<Vector2DF, 4> vertexes = { position + currentPosVector*outerRadius, position + nextPosVector*outerRadius, position + nextPosVector*innerRadius, position + currentPosVector*innerRadius }; std::array<Vector2DF, 4> uvs = { uvCenter + currentUVVector, uvCenter + nextUVVector, uvCenter + nextUVVector*ratio, uvCenter + currentUVVector*ratio }; auto triangle1 = new CoreTriangleShape_Imp(); auto triangle2 = new CoreTriangleShape_Imp(); for (int j = 0; j < 3; ++j) { triangle1->SetPointByIndex(vertexes[j], j); triangle1->SetUVByIndex(uvs[j], j); triangle2->SetPointByIndex(vertexes[(j + 2) % 4], j); triangle2->SetUVByIndex(uvs[(j + 2) % 4], j); } triangles.push_back(triangle1); triangles.push_back(triangle2); currentPosDeg += radInc; currentUVDeg += radInc; } }
void CoreLayer2D_Imp::DrawArcAdditionally(asd::Vector2DF center, float outerDiameter, float innerDiameter, Color color, int numberOfCorners, int startingCorner, int endingCorner, float angle, Texture2D* texture, AlphaBlendMode alphaBlend, int32_t priority) { if (numberOfCorners < 3) return; const float radInc = 360.0 / numberOfCorners; const float outerRadius = outerDiameter / 2; const float innerRadius = innerDiameter / 2; float currentPosDeg = angle - 90 + startingCorner*radInc; float currentUVDeg = -90 + startingCorner*radInc; Vector2DF baseVector(0, -1); baseVector.SetDegree(currentPosDeg); Vector2DF uvCenter = { 0.5, 0.5 }; Vector2DF uvVector = { 0, -0.5 }; float ratio = innerDiameter / outerDiameter; int endcorner = endingCorner; while (endcorner < startingCorner) endcorner += numberOfCorners; for (int i = 0; i < endcorner - startingCorner; ++i) { Vector2DF currentPosVector = baseVector; currentPosVector.SetDegree(currentPosDeg); Vector2DF nextPosVector = currentPosVector; auto nextPosDeg = nextPosVector.GetDegree(); nextPosDeg += radInc; nextPosVector.SetDegree(nextPosDeg); Vector2DF currentUVVector = uvVector; currentUVVector.SetDegree(currentUVDeg); Vector2DF nextUVVector = currentUVVector; auto nextUVDeg = nextUVVector.GetDegree(); nextUVDeg += radInc; nextUVVector.SetDegree(nextUVDeg); std::array<Vector2DF, 4> vertexes = { center + currentPosVector*outerRadius, center + nextPosVector*outerRadius, center + nextPosVector*innerRadius, center + currentPosVector*innerRadius }; std::array<Vector2DF, 4> uvs = { uvCenter + currentUVVector, uvCenter + nextUVVector, uvCenter + nextUVVector*ratio, uvCenter + currentUVVector*ratio }; std::array<Color, 4> colors = { color, color, color, color }; SafeAddRef(texture); { Sprite sprite; sprite.pos = vertexes; sprite.col = colors; sprite.uv = uvs; sprite.Texture_ = CreateSharedPtrWithReleaseDLL(texture); sprite.AlphaBlend_ = alphaBlend; sprite.Priority = priority; sprites.push_back(sprite); } currentPosDeg += radInc; currentUVDeg += radInc; } }