2024-04-01 18:26:14 +08:00

154 lines
3.2 KiB
C++

#include "Part.h"
Part::Part(int id, PartPosBean* bbp)
:m_PartPosBean(bbp)
, m_GlobalOffsetX(0.0)
, m_GlobalOffsetY(0.0)
, m_IsPrintable(true)
, m_DisplayPerscent(1.0)
, m_ID(id)
{
m_Effect = new vl::Effect;
}
Part::~Part()
{
}
void Part::AddLine(std::vector<vl::fvec3>& line)
{
for (unsigned int i = 0; i < line.size() && line.size() > 1; i++)
{
m_Points.push_back(line[i]);
unsigned int idx = m_Points.size() - 1;
if (i == 0 || i == (line.size() - 1))
m_Indexs.push_back(idx);
else
{
m_Indexs.push_back(idx);
m_Indexs.push_back(idx);
}
}
}
void Part::AddPoint(double x, double y, double z)
{
vl::fvec3 p(x, y, z);
m_Points.push_back(p);
unsigned int idx = m_Points.size() - 1;
m_Indexs.push_back(idx);
if (idx > 0)
m_Indexs.push_back(idx);
}
void Part::Update(void)
{
if (m_Points.size() == 0)
return;
m_Geo = new vl::Geometry;
m_Vtx = new vl::ArrayFloat3;
m_Geo->setVertexArray(m_Vtx.get());
m_Ele = new vl::DrawElementsUInt(vl::PT_LINES);
m_Geo->drawCalls().push_back(m_Ele.get());
m_Transform = new vl::Transform;
m_Vtx->initFrom(m_Points);
m_Ele->indexBuffer()->resize(m_Indexs.size());
for (unsigned int i = 0; i < m_Indexs.size(); i++)
m_Ele->indexBuffer()->at(i) = m_Indexs[i];
if (m_IsPrintable)
m_Effect->shader()->gocColor()->setValue(vl::skyblue);
else
m_Effect->shader()->gocColor()->setValue(vl::darkgray);
m_Effect->shader()->enable(vl::EN_DEPTH_TEST);
m_Actor = new vl::Actor(m_Geo.get(), m_Effect.get(), m_Transform.get());
m_Center = m_Geo->boundingBox().center();
m_LocalMatrix = m_Transform->localMatrix();
Transform();
}
void Part::Transform(void)
{
if (!m_Geo)
return;
m_Geo->computeBounds();
vl::vec3 center = m_Geo->boundingBox().center();
m_Transform->setLocalMatrix(m_LocalMatrix);
//m_Transform->translate(-center.x(), -center.y(), -center.z());
m_Transform->translate(-m_PartPosBean->m_SrcPartCenterX, -m_PartPosBean->m_SrcPartCenterY, -center.z());
m_Transform->rotate(m_PartPosBean->m_RotateAngle, 0, 0, 1);
//m_Transform->translate(center);
m_Transform->translate(m_PartPosBean->m_SrcPartCenterX, m_PartPosBean->m_SrcPartCenterY, center.z());
m_Transform->translate(m_PartPosBean->m_XOffset + m_GlobalOffsetX, m_PartPosBean->m_YOffset + m_GlobalOffsetY, 0);
}
/*void Part::UpdateOffset(double x, double y, double r)
{
if (m_OffsetX == x && m_OffsetY == y && m_Rotated == r)
return;
m_OffsetX = x;
m_OffsetY = y;
m_Rotated = r;
Transform();
m_IsUpdated = true;
}*/
/*void Part::UpdateOffset(double x, double y)
{
if (m_OffsetX == x && m_OffsetY == y)
return;
m_OffsetX = x;
m_OffsetY = y;
Transform();
m_IsUpdated = true;
}*/
void Part::UpdateGlobalOffset(double x, double y)
{
if (m_GlobalOffsetX == x && m_GlobalOffsetY == y)
return;
m_GlobalOffsetX = x;
m_GlobalOffsetY = y;
Transform();
m_IsUpdated = true;
}
void Part::RemoveData(void)
{
m_Points.clear();
m_Indexs.clear();
m_Geo = nullptr;
m_Vtx = nullptr;
m_Ele = nullptr;
m_Actor = nullptr;
m_Transform = nullptr;
}
void Part::SetSelected(bool select)
{
m_Selected = select;
if (m_Selected)
m_Effect->shader()->gocColor()->setValue(vl::green);
else if (m_IsPrintable)
m_Effect->shader()->gocColor()->setValue(vl::skyblue);
else
m_Effect->shader()->gocColor()->setValue(vl::darkgray);
}