ImplicitFuncCSG::ImplicitFuncCSG(const BBox<scalar,2>& bb,OP_TYPE op):_alpha(0.8f) { boost::shared_ptr<ImplicitFuncCSG> axis0(new ImplicitFuncCSG(op)); boost::shared_ptr<ImplicitFuncCSG> axis1(new ImplicitFuncCSG(op)); if(op == INTERSECT) { axis0->_a.reset(new ImplicitFuncPlane(Vec3(bb._minC.x(),0.0f,0.0f),Vec3(-1.0f,0.0f,0.0f))); axis0->_b.reset(new ImplicitFuncPlane(Vec3(bb._maxC.x(),0.0f,0.0f),Vec3( 1.0f,0.0f,0.0f))); axis1->_a.reset(new ImplicitFuncPlane(Vec3(0.0f,bb._minC.y(),0.0f),Vec3(0.0f,-1.0f,0.0f))); axis1->_b.reset(new ImplicitFuncPlane(Vec3(0.0f,bb._maxC.y(),0.0f),Vec3(0.0f, 1.0f,0.0f))); } else { axis0->_a.reset(new ImplicitFuncPlane(Vec3(bb._minC.x(),0.0f,0.0f),Vec3( 1.0f,0.0f,0.0f))); axis0->_b.reset(new ImplicitFuncPlane(Vec3(bb._maxC.x(),0.0f,0.0f),Vec3(-1.0f,0.0f,0.0f))); axis1->_a.reset(new ImplicitFuncPlane(Vec3(0.0f,bb._minC.y(),0.0f),Vec3(0.0f, 1.0f,0.0f))); axis1->_b.reset(new ImplicitFuncPlane(Vec3(0.0f,bb._maxC.y(),0.0f),Vec3(0.0f,-1.0f,0.0f))); } _a=axis0; _b=axis1; }
//---------------------------------------------------------------------------- void RoughPlaneSolidBox::MoveBox () { float x = (float)mModule.GetX(); float w = (float)mModule.GetW(); float xExt = (float)mModule.XLocExt; float yExt = (float)mModule.YLocExt; float zExt = (float)mModule.ZLocExt; float sinPhi = (float)mModule.SinAngle; float cosPhi = (float)mModule.CosAngle; float theta = (float)mModule.GetTheta(); float sinTheta = Mathf::Sin(theta); float cosTheta = Mathf::Cos(theta); // Compute the box center. APoint center(x, w*cosPhi - zExt*sinPhi, w*sinPhi + zExt*cosPhi); // Compute the box orientation. AVector axis0(cosTheta, -sinTheta*cosPhi, -sinTheta*sinPhi); AVector axis1(sinTheta, +cosTheta*cosPhi, +cosTheta*sinPhi); AVector axis2(0.0f, -sinPhi, cosPhi); // Keep the box from sliding below the ground. float zRadius = xExt*Mathf::FAbs(axis0.Z()) + yExt*Mathf::FAbs(axis1.Z()) + zExt*Mathf::FAbs(axis2.Z()); if (center.Z() >= zRadius) { // Update the box. mBox->LocalTransform.SetTranslate(center); mBox->LocalTransform.SetRotate(HMatrix(axis0, axis1, axis2, APoint::ORIGIN, true)); mBox->Update(); } else { mDoUpdate = false; } }