bool CoreShape_Imp::GetIsCollidedWithCircleAndRect(CoreCircleShape* circle, CoreRectangleShape* rectangle) { auto untransformedVertexes = rectangle->GetDrawingArea().GetVertexes(); Vector2DF untransformedOrigin = (untransformedVertexes[0] + untransformedVertexes[1] + untransformedVertexes[2] + untransformedVertexes[3]) / 4; Vector2DF vec = (untransformedOrigin - (untransformedVertexes[0] + rectangle->GetCenterPosition())); vec.SetDegree(vec.GetDegree() + rectangle->GetAngle()); Vector2DF rectGlobalCenter = untransformedVertexes[0] + rectangle->GetCenterPosition() + vec; Vector2DF c; c.X = std::cos(rectangle->GetAngle()) * (circle->GetPosition().X - rectGlobalCenter.X) - std::sin(rectangle->GetAngle()) * (circle->GetPosition().Y - rectGlobalCenter.Y) + rectGlobalCenter.X; c.Y = std::sin(rectangle->GetAngle()) * (circle->GetPosition().X - rectGlobalCenter.X) + std::cos(rectangle->GetAngle()) * (circle->GetPosition().Y - rectGlobalCenter.Y) + rectGlobalCenter.Y; Vector2DF nearestPos; Vector2DF rectGlobalPos = rectangle->GetDrawingArea().GetPosition(); Vector2DF rectSize = rectangle->GetDrawingArea().GetSize(); if (c.X < rectGlobalPos.X) { nearestPos.X = rectGlobalPos.X; } else if (c.X > rectGlobalPos.X + rectSize.X) { nearestPos.X = rectGlobalPos.X + rectSize.X; } else { nearestPos.X = c.X; } if (c.Y < rectGlobalPos.Y) { nearestPos.Y = rectGlobalPos.Y; } else if (c.Y > rectGlobalPos.Y + rectSize.Y) { nearestPos.Y = rectGlobalPos.Y + rectSize.Y; } else { nearestPos.Y = c.Y; } float radius2 = pow(circle->GetOuterDiameter() / 2, 2); float dist = (c - nearestPos).GetSquaredLength(); return dist < radius2; }
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; } }