#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& 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); }