154 lines
3.2 KiB
C++
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);
|
|
|
|
}
|