/** GDevelop - Primitive Drawing Extension Copyright (c) 2008-2016 Florian Rival (Florian.Rival@gmail.com) This project is released under the MIT License. */ #include #include "GDCore/Tools/Localization.h" #include "GDCpp/Runtime/CommonTools.h" #include "GDCpp/Runtime/FontManager.h" #include "GDCpp/Runtime/ImageManager.h" #include "GDCpp/Runtime/Polygon2d.h" #include "GDCpp/Runtime/Project/InitialInstance.h" #include "GDCpp/Runtime/Project/Object.h" #include "GDCpp/Runtime/Project/Project.h" #include "GDCpp/Runtime/RuntimeScene.h" #include "GDCpp/Runtime/Serialization/SerializerElement.h" #include "ShapePainterObject.h" #if defined(GD_IDE_ONLY) #include "GDCpp/Runtime/CommonTools.h" #endif using namespace std; ShapePainterObjectBase::ShapePainterObjectBase() : fillColorR(255), fillColorG(255), fillColorB(255), fillOpacity(255), outlineSize(1), outlineColorR(0), outlineColorG(0), outlineColorB(0), outlineOpacity(255), absoluteCoordinates(false) {} ShapePainterObject::ShapePainterObject(gd::String name_) : gd::Object(name_) {} RuntimeShapePainterObject::RuntimeShapePainterObject( RuntimeScene& scene, const ShapePainterObject& shapePainterObject) : RuntimeObject(scene, shapePainterObject) { ShapePainterObjectBase::operator=(shapePainterObject); } void ShapePainterObjectBase::DoUnserializeFrom( const gd::SerializerElement& element) { fillOpacity = element.GetChild("fillOpacity", 0, "FillOpacity").GetValue().GetInt(); outlineSize = element.GetChild("outlineSize", 0, "OutlineSize").GetValue().GetInt(); outlineOpacity = element.GetChild("outlineOpacity", 0, "OutlineOpacity") .GetValue() .GetInt(); fillColorR = element.GetChild("fillColor", 0, "FillColor").GetIntAttribute("r"); fillColorG = element.GetChild("fillColor", 0, "FillColor").GetIntAttribute("g"); fillColorB = element.GetChild("fillColor", 0, "FillColor").GetIntAttribute("b"); outlineColorR = element.GetChild("outlineColor", 0, "OutlineColor").GetIntAttribute("r"); outlineColorG = element.GetChild("outlineColor", 0, "OutlineColor").GetIntAttribute("g"); outlineColorB = element.GetChild("outlineColor", 0, "OutlineColor").GetIntAttribute("b"); absoluteCoordinates = element.GetChild("absoluteCoordinates", 0, "AbsoluteCoordinates") .GetValue() .GetBool(); } void ShapePainterObject::DoUnserializeFrom( gd::Project& project, const gd::SerializerElement& element) { ShapePainterObjectBase::DoUnserializeFrom(element); } #if defined(GD_IDE_ONLY) void ShapePainterObjectBase::DoSerializeTo( gd::SerializerElement& element) const { element.AddChild("fillOpacity").SetValue(fillOpacity); element.AddChild("outlineSize").SetValue(outlineSize); element.AddChild("outlineOpacity").SetValue(outlineOpacity); element.AddChild("fillColor") .SetAttribute("r", (int)fillColorR) .SetAttribute("g", (int)fillColorG) .SetAttribute("b", (int)fillColorB); element.AddChild("outlineColor") .SetAttribute("r", (int)outlineColorR) .SetAttribute("g", (int)outlineColorG) .SetAttribute("b", (int)outlineColorB); element.AddChild("absoluteCoordinates").SetValue(absoluteCoordinates); } void ShapePainterObject::DoSerializeTo(gd::SerializerElement& element) const { ShapePainterObjectBase::DoSerializeTo(element); } #endif /** * Render object at runtime */ bool RuntimeShapePainterObject::Draw(sf::RenderTarget& renderTarget) { // Don't draw anything if hidden if (hidden) { shapesToDraw.clear(); return true; } for (std::size_t i = 0; i < shapesToDraw.size(); ++i) { renderTarget.draw(shapesToDraw[i].rectangleShape); renderTarget.draw(shapesToDraw[i].circleShape); } shapesToDraw.clear(); return true; } #if defined(GD_IDE_ONLY) void RuntimeShapePainterObject::GetPropertyForDebugger( std::size_t propertyNb, gd::String& name, gd::String& value) const { if (propertyNb == 0) { name = _("Fill color"); value = gd::String::From(GetFillColorR()) + ";" + gd::String::From(GetFillColorG()) + ";" + gd::String::From(GetFillColorB()); } else if (propertyNb == 1) { name = _("Fill opacity"); value = gd::String::From(GetFillOpacity()); } else if (propertyNb == 2) { name = _("Outline size"); value = gd::String::From(GetOutlineSize()); } else if (propertyNb == 3) { name = _("Outline color"); value = gd::String::From(GetOutlineColorR()) + ";" + gd::String::From(GetOutlineColorG()) + ";" + gd::String::From(GetOutlineColorB()); } else if (propertyNb == 4) { name = _("Outline opacity"); value = gd::String::From(GetOutlineOpacity()); } } bool RuntimeShapePainterObject::ChangeProperty(std::size_t propertyNb, gd::String newValue) { if (propertyNb == 0) { std::vector colors = newValue.Split(U';'); if (colors.size() < 3) return false; // Color is not valid SetFillColor(colors[0].To(), colors[1].To(), colors[2].To()); } else if (propertyNb == 1) { SetFillOpacity(newValue.To()); } else if (propertyNb == 2) { SetOutlineSize(newValue.To()); } else if (propertyNb == 3) { std::vector colors = newValue.Split(U';'); if (colors.size() < 3) return false; // Color is not valid SetOutlineColor( colors[0].To(), colors[1].To(), colors[2].To()); } else if (propertyNb == 4) { SetOutlineOpacity(newValue.To()); } return true; } std::size_t RuntimeShapePainterObject::GetNumberOfProperties() const { return 5; } #endif /** * Change the color filter of the sprite object */ void ShapePainterObjectBase::SetFillColor(unsigned int r, unsigned int g, unsigned int b) { fillColorR = r; fillColorG = g; fillColorB = b; } void ShapePainterObjectBase::SetFillOpacity(float val) { if (val > 255) val = 255; else if (val < 0) val = 0; fillOpacity = val; } /** * Change the color filter of the sprite object */ void ShapePainterObjectBase::SetOutlineColor(unsigned int r, unsigned int g, unsigned int b) { outlineColorR = r; outlineColorG = g; outlineColorB = b; } void ShapePainterObjectBase::SetOutlineOpacity(float val) { if (val > 255) val = 255; else if (val < 0) val = 0; outlineOpacity = val; } /** * Change the fill color */ void ShapePainterObjectBase::SetFillColor(const gd::String& color) { std::vector colors = color.Split(U';'); if (colors.size() < 3) return; fillColorR = colors[0].To(); fillColorG = colors[1].To(); fillColorB = colors[2].To(); } /** * Change the color of the outline */ void ShapePainterObjectBase::SetOutlineColor(const gd::String& color) { std::vector colors = color.Split(U';'); if (colors.size() < 3) return; outlineColorR = colors[0].To(); outlineColorG = colors[1].To(); outlineColorB = colors[2].To(); } void RuntimeShapePainterObject::DrawRectangle(float x, float y, float x2, float y2) { float Xgap = AreCoordinatesAbsolute() ? 0 : GetX(); float Ygap = AreCoordinatesAbsolute() ? 0 : GetY(); DrawingCommand command(sf::RectangleShape(sf::Vector2f(x2 - x, y2 - y))); command.rectangleShape.setPosition(x + Xgap, y + Ygap); command.rectangleShape.setFillColor(sf::Color( GetFillColorR(), GetFillColorG(), GetFillColorB(), GetFillOpacity())); command.rectangleShape.setOutlineThickness(GetOutlineSize()); command.rectangleShape.setOutlineColor(sf::Color(GetOutlineColorR(), GetOutlineColorG(), GetOutlineColorB(), GetOutlineOpacity())); shapesToDraw.push_back(command); } void RuntimeShapePainterObject::DrawLine( float x, float y, float x2, float y2, float thickness) { float Xgap = AreCoordinatesAbsolute() ? 0 : GetX(); float Ygap = AreCoordinatesAbsolute() ? 0 : GetY(); float length = sqrt((x - x2) * (x - x2) + (y - y2) * (y - y2)); DrawingCommand command(sf::RectangleShape(sf::Vector2f(length, thickness))); command.rectangleShape.setPosition((x + x2) / 2 + Xgap, (y + y2) / 2 + Ygap); command.rectangleShape.setOrigin(length / 2, thickness / 2); command.rectangleShape.setRotation(atan2(y2 - y, x2 - x) * 180 / 3.14159); command.rectangleShape.setFillColor(sf::Color( GetFillColorR(), GetFillColorG(), GetFillColorB(), GetFillOpacity())); command.rectangleShape.setOutlineThickness(GetOutlineSize()); command.rectangleShape.setOutlineColor(sf::Color(GetOutlineColorR(), GetOutlineColorG(), GetOutlineColorB(), GetOutlineOpacity())); shapesToDraw.push_back(command); } void RuntimeShapePainterObject::DrawCircle(float x, float y, float radius) { float Xgap = AreCoordinatesAbsolute() ? 0 : GetX(); float Ygap = AreCoordinatesAbsolute() ? 0 : GetY(); sf::CircleShape circle(radius); DrawingCommand command(circle); command.circleShape.setPosition(x + Xgap, y + Ygap); command.circleShape.setOrigin(radius, radius); command.circleShape.setFillColor(sf::Color( GetFillColorR(), GetFillColorG(), GetFillColorB(), GetFillOpacity())); command.circleShape.setOutlineThickness(GetOutlineSize()); command.circleShape.setOutlineColor(sf::Color(GetOutlineColorR(), GetOutlineColorG(), GetOutlineColorB(), GetOutlineOpacity())); shapesToDraw.push_back(command); }