void CGuiObject::AddChildObject(CGuiObject* obj, bool makeWorldLocal, bool atEnd) { obj->x70_parent = this; if (!x74_child) { x74_child = obj; } else if (atEnd) { CGuiObject* prev = nullptr; CGuiObject* cur = x74_child; for (; cur ; cur = cur->x78_nextSibling) {prev = cur;} if (prev) prev->x78_nextSibling = obj; } else { obj->x78_nextSibling = x74_child; x74_child = obj; } if (makeWorldLocal) { zeus::CVector3f negParentWorld = -x34_worldXF.m_origin; zeus::CMatrix3f basisMat( x34_worldXF.m_basis[0] / x34_worldXF.m_basis[0].magnitude(), x34_worldXF.m_basis[1] / x34_worldXF.m_basis[1].magnitude(), x34_worldXF.m_basis[2] / x34_worldXF.m_basis[2].magnitude()); zeus::CVector3f xfWorld = basisMat * negParentWorld; obj->x4_localXF = zeus::CTransform(basisMat, xfWorld) * obj->x34_worldXF; } RecalculateTransforms(); }
void BSplineCurveEvaluator::evaluateCurve(const std::vector<Point>& ptvCtrlPts, std::vector<Point>& ptvEvaluatedCurvePts, const float& fAniLength, const bool& bWrap) const { ptvEvaluatedCurvePts.clear(); std::vector<double> samplePoints(_numSamples + 1,_numSamples); ufGenSample uf; std::transform(samplePoints.begin(),samplePoints.end(),samplePoints.begin(),uf); // if wrapping is off, make the first and last segments of // the curve horizontal. Mat4d basisMat(1.0f/6.0f,-1.0f/2.0f,1.0f/2.0f,-1.0f/6.0f,2.0f/3.0f,0.0f,-1.0f,1.0f/2.0f,1.0f/6.0f,1.0f/2.0f,1.0f/2.0f,-1.0f/2.0f,0.0f,0.0f,0.0f,1.0f/6.0f); std::vector<Point> knotVector; if(~bWrap){ knotVector.push_back(ptvCtrlPts[0]); knotVector.push_back(ptvCtrlPts[0]);} for(std::vector<Point>::const_iterator itC = ptvCtrlPts.begin(); itC!=ptvCtrlPts.end();++itC) knotVector.push_back(*itC); if(bWrap){ knotVector.push_back(*(ptvCtrlPts.end() - 1)); knotVector.push_back(Point(fAniLength + ptvCtrlPts[0].x, ptvCtrlPts[0].y)); knotVector.push_back(Point(fAniLength + ptvCtrlPts[0].x, ptvCtrlPts[0].y));} if(~bWrap){ knotVector.push_back(*(ptvCtrlPts.end() - 1)); knotVector.push_back(*(ptvCtrlPts.end() - 1));} for(std::vector<Point>::iterator it = knotVector.begin();it!=(knotVector.end()-3);++it){ Point P0 = *it; Point P1 = *(1 + it); Point P2 = *(2 + it); Point P3 = *(3 + it); for(std::vector<double>::iterator it = samplePoints.begin();it!=samplePoints.end();++it){ Vec4d sampleMultVec(1,*it,(*it) * (*it), (*it) * (*it) * (*it)); Vec4d result = basisMat * sampleMultVec; Point evalPt = (result[0]*P0) + (result[1]*P1) + (result[2]*P2) + (result[3]*P3); if(bWrap){ if(evalPt.x>fAniLength){ evalPt.x-=fAniLength; if(evalPt.x>ptvCtrlPts[0].x) continue;}} ptvEvaluatedCurvePts.push_back(evalPt); } } if(!bWrap){ ptvEvaluatedCurvePts.push_back(Point(0.0f,ptvCtrlPts[0].y)); ptvEvaluatedCurvePts.push_back(Point(fAniLength,(*(ptvCtrlPts.end() -1)).y)); } }