Magic_Game/core/base/Unit.cpp

149 lines
3.4 KiB
C++

// Copyright (c) 2016-2018 Easy2D - Nomango
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#include "Unit.h"
namespace easy2d
{
Unit::Unit()
: transform_()
, dirty_transform_(false)
{
}
Unit::~Unit()
{
}
math::Matrix const & Unit::GetTransformMatrix()
{
if (dirty_transform_)
{
UpdateMatrix();
dirty_transform_ = false;
}
return matrix_cached_;
}
void Unit::SetPositionX(float x)
{
this->SetPosition(x, transform_.position.y);
}
void Unit::SetPositionY(float y)
{
this->SetPosition(transform_.position.x, y);
}
void Unit::SetPosition(const Point & p)
{
this->SetPosition(p.x, p.y);
}
void Unit::SetPosition(float x, float y)
{
if (transform_.position.x == x && transform_.position.y == y)
return;
transform_.position.x = x;
transform_.position.y = y;
dirty_transform_ = true;
}
void Unit::MoveBy(float x, float y)
{
this->SetPosition(transform_.position.x + x, transform_.position.y + y);
}
void Unit::MoveBy(const Point & v)
{
this->MoveBy(v.x, v.y);
}
void Unit::SetScaleX(float scale_x)
{
this->SetScale(scale_x, transform_.scale.y);
}
void Unit::SetScaleY(float scale_y)
{
this->SetScale(transform_.scale.x, scale_y);
}
void Unit::SetScale(float scale)
{
this->SetScale(scale, scale);
}
void Unit::SetScale(float scale_x, float scale_y)
{
if (transform_.scale.x == scale_x && transform_.scale.y == scale_y)
return;
transform_.scale.x = scale_x;
transform_.scale.y = scale_y;
dirty_transform_ = true;
}
void Unit::SetSkewX(float skew_x)
{
this->SetSkew(skew_x, transform_.skew.y);
}
void Unit::SetSkewY(float skew_y)
{
this->SetSkew(transform_.skew.x, skew_y);
}
void Unit::SetSkew(float skew_x, float skew_y)
{
if (transform_.skew.x == skew_x && transform_.skew.y == skew_y)
return;
transform_.skew.x = skew_x;
transform_.skew.y = skew_y;
dirty_transform_ = true;
}
void Unit::SetRotation(float angle)
{
if (transform_.rotation == angle)
return;
transform_.rotation = angle;
dirty_transform_ = true;
}
void Unit::SetTransform(Transform const& transform)
{
transform_ = transform;
}
void Unit::UpdateMatrix()
{
Point center;
matrix_cached_ = math::Matrix::Scaling(transform_.scale, center)
* math::Matrix::Skewing(transform_.skew.x, transform_.skew.y, center)
* math::Matrix::Rotation(transform_.rotation, center)
* math::Matrix::Translation(transform_.position - center);
}
}