Esempio n. 1
0
        bool CreateBrushTool::handleStartPlaneDrag(InputState& inputState, Planef& plane, Vec3f& initialPoint) {
            assert(m_brush == NULL);
            
            Model::EditStateManager& editStateManager = document().editStateManager();
            if (inputState.mouseButtons() != MouseButtons::MBLeft ||
                inputState.modifierKeys() != ModifierKeys::MKNone ||
                editStateManager.selectionMode() != Model::EditStateManager::SMNone)
                return false;
            
            Model::FaceHit* hit = static_cast<Model::FaceHit*>(inputState.pickResult().first(Model::HitType::FaceHit, true, m_filter));
            if (hit != NULL) {
                initialPoint = hit->hitPoint();
            } else {
                Renderer::Camera& camera = view().camera();
                initialPoint = camera.defaultPoint(inputState.pickRay().direction);
            }

            plane = Planef(Vec3f::PosZ, initialPoint);
            m_initialPoint = initialPoint;
            updateBounds(m_initialPoint);
            
            Preferences::PreferenceManager& prefs = Preferences::PreferenceManager::preferences();
            Renderer::TextureRendererManager& textureRendererManager = document().sharedResources().textureRendererManager();

            m_brushFigure = new Renderer::BrushFigure(textureRendererManager);
            m_brushFigure->setFaceColor(prefs.getColor(Preferences::FaceColor));
            m_brushFigure->setEdgeColor(prefs.getColor(Preferences::SelectedEdgeColor));
            m_brushFigure->setOccludedEdgeColor(prefs.getColor(Preferences::OccludedSelectedEdgeColor));
            m_brushFigure->setEdgeMode(Renderer::BrushFigure::EMRenderOccluded);

            m_brush = new Model::Brush(document().map().worldBounds(), document().map().forceIntegerFacePoints(), m_bounds, document().mruTexture());
            m_brushFigure->setBrush(*m_brush);
            
            return true;
        }
Esempio n. 2
0
        float Grid::intersectWithRay(const Rayf& ray, unsigned int skip) const {
            Vec3f planeAnchor;
            
            for (size_t i = 0; i < 3; i++)
                planeAnchor[i] = ray.direction[i] > 0.0f ? snapUp(ray.origin[i], true) + skip * actualSize() : snapDown(ray.origin[i], true) - skip * actualSize();

            Planef plane(Vec3f::PosX, planeAnchor);
            float distX = plane.intersectWithRay(ray);
            
            plane = Planef(Vec3f::PosY, planeAnchor);
            float distY = plane.intersectWithRay(ray);
            
            plane = Planef(Vec3f::PosZ, planeAnchor);
            float distZ = plane.intersectWithRay(ray);
            
            float dist = distX;
            if (!Math<float>::isnan(distY) && (Math<float>::isnan(dist) || std::abs(distY) < std::abs(dist)))
                dist = distY;
            if (!Math<float>::isnan(distZ) && (Math<float>::isnan(dist) || std::abs(distZ) < std::abs(dist)))
                dist = distZ;
            
            return dist;
        }
Esempio n. 3
0
 void CreateBrushTool::handleResetPlane(InputState& inputState, Planef& plane, Vec3f& initialPoint) {
     float distance = plane.intersectWithRay(inputState.pickRay());
     if (Math<float>::isnan(distance))
         return;
     initialPoint = inputState.pickRay().pointAtDistance(distance);
     
     if (inputState.modifierKeys() == ModifierKeys::MKAlt) {
         Vec3f planeNorm = inputState.pickRay().direction;
         planeNorm[2] = 0.0f;
         planeNorm.normalize();
         plane = Planef(planeNorm, initialPoint);
     } else {
         plane = Planef::horizontalDragPlane(initialPoint);
     }
 }
Esempio n. 4
0
void Frustum::Extract(const Matrix44f &view, const Projection &proj) {
  static const int LBN = kLBNCorner, LTN = kLTNCorner, LBF = kLBFCorner,
                   LTF = kLTFCorner, RBN = kRBNCorner, RTN = kRTNCorner,
                   RBF = kRBFCorner, RTF = kRTFCorner;

  const float lnear = -proj.get_near();
  const float lfar = -proj.get_far();
  const Vec3f nearNorm(0.0f, 0.0f, -1.0f);
  const Vec3f farNorm(0.0f, 0.0f, 1.0f);

  // kLeftPlane plane
  const Vec3f ltn(proj.get_left(), proj.get_top(), lnear),
      lbn(proj.get_left(), proj.get_bottom(), lnear),
      ltf(proj.get_far_left(), proj.get_far_top(), lfar),
      lbf(proj.get_far_left(), proj.get_far_bottom(), lfar);

  const Vec3f leftNorm = vecNormal(
      vecCross(lbn - ltn, ltf - ltn));

  // kRightPlane plane
  const Vec3f rtn(proj.get_right(), proj.get_top(), lnear), // right top near
      rbn(proj.get_right(), proj.get_bottom(), lnear), // right bottom near
      rtf(proj.get_far_right(), proj.get_far_top(), lfar); // right top far

  const Vec3f rightNorm = vecNormal(vecCross(rtf - rtn, rbn - rtn));

  // kTopPlane plane
  const Vec3f topNorm = vecNormal(vecCross(ltf - ltn, rtn - ltn));

  // kBottomPlane plane lbn rbf
  const Vec3f rbf(proj.get_far_right(), proj.get_far_bottom(), lfar);
  const Vec3f botNorm = vecNormal(vecCross(rbf - rbn, lbn - rbn));

  Matrix44f viewSpace, viewSpaceN;
  matrixInverse(view, &viewSpace);

  viewSpaceN = matrixTranspose(view);

  m_conners[LBN] = lbn * viewSpace;
  m_conners[LTN] = ltn * viewSpace;
  m_conners[LBF] = lbf * viewSpace;
  m_conners[LTF] = ltf * viewSpace;
  m_conners[RBN] = rbn * viewSpace;
  m_conners[RTN] = rtn * viewSpace;
  m_conners[RBF] = rbf * viewSpace;
  m_conners[RTF] = rtf * viewSpace;

  m_planes[kLeftPlane] = Planef(leftNorm * viewSpaceN, m_conners[LTN]);
  m_planes[kRightPlane] = Planef(rightNorm * viewSpaceN, m_conners[RTN]);
  m_planes[kTopPlane] = Planef(topNorm * viewSpaceN, m_conners[RTN]);
  m_planes[kBottomPlane] = Planef(botNorm * viewSpaceN, m_conners[LBN]);
  m_planes[kNearPlane] = Planef(nearNorm * viewSpaceN, m_conners[LBN]);
  m_planes[kFarPlane] = Planef(farNorm * viewSpaceN, m_conners[RTF]);
}
Esempio n. 5
0
//------------------------------------------------------------------------------
//!
bool
DFPolygonManipulator::onPointerPress( const Event& ev )
{
   _clearSel = false;
   // Vertex creation.
   if( Core::isKeyPressed( Key::SHIFT ) )
   {
      // Intersection ray and normal.
      float t = CGConstf::infinity();
      Rayf ray( camera()->position(), viewport()->direction( ev.position() ) );
      Planef plane( Vec3f( 0.0f, 0.0f, 1.0f ) );
      if( Intersector::trace( plane, ray, t ) )
      {
         Vec3f p = ray.point(t);
         _editor->createVertex( p );
      }
      return true;
   }

   // Picking.
   if( _renderable->pick( *viewport(), ev.position(), 10.0f, _pick ) )
   {
      // Update selection.
      if( Core::isKeyPressed(Key::CTRL) )
      {
         if( !_editor->toggleSelection( _pick ) ) _pick.invalidate();
      }
      else if( !_editor->selection().has( _pick ) ) _editor->setSelection( _pick );
      // Find intersection plane.
      Vec3f n( 0.0f, 0.0f, 1.0f );
      Vec3f p = editor()->polygon()->vertex( _pick._idx );
      _plane  = Planef( n, p );
   }
   else
      _clearSel = true;
   return !_clearSel;
}