void GridModel::draw(const core::visual::VisualParams* vparams) { if (!isActive() || !((getNext()==NULL)?vparams->displayFlags().getShowCollisionModels():vparams->displayFlags().getShowBoundingCollisionModels())) return; glDisable(GL_LIGHTING); int level=0; CollisionModel* m = getPrevious(); float color = 1.0f; while (m!=NULL) { m = m->getPrevious(); ++level; color *= 0.5f; } if (isSimulated()) glColor4f(1.0f, 1.0f, 1.0f, color); else glColor4f(1.0f, 1.0f, 0.0f, color); if (color < 1.0f) { glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDepthMask(0); } for (int i=0;i<size;i++) { draw(vparams,i); } if (color < 1.0f) { glDisable(GL_BLEND); glDepthMask(1); } if (getPrevious()!=NULL) getPrevious()->draw(vparams); }
/// Get a color that can be used to display this CollisionModel const float* CollisionModel::getColor4f() { //TODO FIXME because of: https://github.com/sofa-framework/sofa/issues/64 static const float defaultColorSimulatedMovingActive[4] = {1, 0.5f, 0, 1}; static const float defaultColorSimulatedMoving[4] = {0.5f, 0.25f, 0, 1}; static const float defaultColorSimulatedActive[4] = {1, 0, 0, 1}; static const float defaultColorSimulated[4] = {0.5f, 0, 0, 1}; static const float defaultColorMovingActive[4] = {0, 1, 0.5f, 1}; static const float defaultColorMoving[4] = {0, 0.5f, 0.25f, 1}; static const float defaultColorActive[4] = {0.5f, 0.5f, 0.5f, 1}; static const float defaultColor[4] = {0.25f, 0.25f, 0.25f, 1}; if (color.isSet()) return color.getValue().data(); else if (isSimulated()) if (isMoving()) if (isActive()) {setColor4f(defaultColorSimulatedMovingActive); return defaultColorSimulatedMovingActive;} else {setColor4f(defaultColorSimulatedMoving); return defaultColorSimulatedMoving;} else if (isActive()) {setColor4f(defaultColorSimulatedActive); return defaultColorSimulatedActive;} else {setColor4f(defaultColorSimulated); return defaultColorSimulated;} else if (isMoving()) if (isActive()) {setColor4f(defaultColorMovingActive); return defaultColorMovingActive;} else {setColor4f(defaultColorMoving); return defaultColorMoving;} else if (isActive()) {setColor4f(defaultColorActive); return defaultColorActive;} else {setColor4f(defaultColor); return defaultColor;} }
/// Get a color that can be used to display this CollisionModel const float* CollisionModel::getColor4f() { static float defaultColorSimulatedMovingActive[4] = {1, 0.5f, 0, 1}; static float defaultColorSimulatedMoving[4] = {0.5f, 0.25f, 0, 1}; static float defaultColorSimulatedActive[4] = {1, 0, 0, 1}; static float defaultColorSimulated[4] = {0.5f, 0, 0, 1}; static float defaultColorMovingActive[4] = {0, 1, 0.5f, 1}; static float defaultColorMoving[4] = {0, 0.5f, 0.25f, 1}; static float defaultColorActive[4] = {0.5f, 0.5f, 0.5f, 1}; static float defaultColor[4] = {0.25f, 0.25f, 0.25f, 1}; if (color.isSet()) return color.getValue().ptr(); else if (isSimulated()) if (isMoving()) if (isActive()) {setColor4f(defaultColorSimulatedMovingActive); return defaultColorSimulatedMovingActive;} else {setColor4f(defaultColorSimulatedMoving); return defaultColorSimulatedMoving;} else if (isActive()) {setColor4f(defaultColorSimulatedActive); return defaultColorSimulatedActive;} else {setColor4f(defaultColorSimulated); return defaultColorSimulated;} else if (isMoving()) if (isActive()) {setColor4f(defaultColorMovingActive); return defaultColorMovingActive;} else {setColor4f(defaultColorMoving); return defaultColorMoving;} else if (isActive()) {setColor4f(defaultColorActive); return defaultColorActive;} else {setColor4f(defaultColor); return defaultColor;} }
void CubeModel::draw(const core::visual::VisualParams* vparams) { if (!isActive() || !((getNext()==NULL)?vparams->displayFlags().getShowCollisionModels():vparams->displayFlags().getShowBoundingCollisionModels())) return; int level=0; CollisionModel* m = getPrevious(); float color = 1.0f; while (m!=NULL) { m = m->getPrevious(); ++level; color *= 0.5f; } Vec<4,float> c; if (isSimulated()) c=Vec<4,float>(1.0f, 1.0f, 1.0f, color); else c=Vec<4,float>(1.0f, 1.0f, 1.0f, color); std::vector< Vector3 > points; for (int i=0; i<size; i++) { const Vector3& vmin = elems[i].minBBox; const Vector3& vmax = elems[i].maxBBox; points.push_back(Vector3(vmin[0], vmin[1], vmin[2])); points.push_back(Vector3(vmin[0], vmin[1], vmax[2])); points.push_back(Vector3(vmin[0], vmax[1], vmin[2])); points.push_back(Vector3(vmin[0], vmax[1], vmax[2])); points.push_back(Vector3(vmax[0], vmin[1], vmin[2])); points.push_back(Vector3(vmax[0], vmin[1], vmax[2])); points.push_back(Vector3(vmax[0], vmax[1], vmin[2])); points.push_back(Vector3(vmax[0], vmax[1], vmax[2])); points.push_back(Vector3(vmin[0], vmin[1], vmin[2])); points.push_back(Vector3(vmin[0], vmax[1], vmin[2])); points.push_back(Vector3(vmin[0], vmin[1], vmax[2])); points.push_back(Vector3(vmin[0], vmax[1], vmax[2])); points.push_back(Vector3(vmax[0], vmin[1], vmin[2])); points.push_back(Vector3(vmax[0], vmax[1], vmin[2])); points.push_back(Vector3(vmax[0], vmin[1], vmax[2])); points.push_back(Vector3(vmax[0], vmax[1], vmax[2])); points.push_back(Vector3(vmin[0], vmin[1], vmin[2])); points.push_back(Vector3(vmax[0], vmin[1], vmin[2])); points.push_back(Vector3(vmin[0], vmax[1], vmin[2])); points.push_back(Vector3(vmax[0], vmax[1], vmin[2])); points.push_back(Vector3(vmin[0], vmin[1], vmax[2])); points.push_back(Vector3(vmax[0], vmin[1], vmax[2])); points.push_back(Vector3(vmin[0], vmax[1], vmax[2])); points.push_back(Vector3(vmax[0], vmax[1], vmax[2])); } vparams->drawTool()->drawLines(points, 1, Vec<4,float>(c)); if (getPrevious()!=NULL) getPrevious()->draw(vparams); }
int MouseRelatedEvent::offsetY() { if (isSimulated()) return 0; if (!m_hasCachedRelativePosition) computeRelativePosition(); return roundToInt(m_offsetLocation.y()); }
void MouseRelatedEvent::computeRelativePosition() { Node* targetNode = target() ? target()->toNode() : 0; if (!targetNode) return; // Compute coordinates that are based on the target. m_layerLocation = m_pageLocation; m_offsetLocation = m_pageLocation; // Must have an updated render tree for this math to work correctly. targetNode->document()->updateStyleIfNeeded(); // Adjust offsetLocation to be relative to the target's position. if (!isSimulated()) { if (RenderObject* r = targetNode->renderer()) { FloatPoint localPos = r->absoluteToLocal(absoluteLocation(), false, true); m_offsetLocation = roundedLayoutPoint(localPos); float scaleFactor = 1 / pageZoomFactor(this); if (scaleFactor != 1.0f) m_offsetLocation.scale(scaleFactor, scaleFactor); } } // Adjust layerLocation to be relative to the layer. // FIXME: We're pretty sure this is the wrong definition of "layer." // Our RenderLayer is a more modern concept, and layerX/Y is some // other notion about groups of elements (left over from the Netscape 4 days?); // we should test and fix this. Node* n = targetNode; while (n && !n->renderer()) n = n->parentNode(); RenderLayer* layer; if (n && (layer = n->renderer()->enclosingLayer())) { layer->updateLayerPosition(); for (; layer; layer = layer->parent()) { m_layerLocation -= toSize(layer->location()); } } m_hasCachedRelativePosition = true; }
void MouseRelatedEvent::receivedTarget() { ASSERT(target()); Node* targ = target()->toNode(); if (!targ) return; // Compute coordinates that are based on the target. m_layerX = m_pageX; m_layerY = m_pageY; m_offsetX = m_pageX; m_offsetY = m_pageY; // Must have an updated render tree for this math to work correctly. targ->document()->updateStyleIfNeeded(); // Adjust offsetX/Y to be relative to the target's position. if (!isSimulated()) { if (RenderObject* r = targ->renderer()) { FloatPoint localPos = r->absoluteToLocal(absoluteLocation(), false, true); float zoomFactor = pageZoomFactor(this); m_offsetX = lroundf(localPos.x() / zoomFactor); m_offsetY = lroundf(localPos.y() / zoomFactor); } } // Adjust layerX/Y to be relative to the layer. // FIXME: We're pretty sure this is the wrong definition of "layer." // Our RenderLayer is a more modern concept, and layerX/Y is some // other notion about groups of elements (left over from the Netscape 4 days?); // we should test and fix this. Node* n = targ; while (n && !n->renderer()) n = n->parentNode(); if (n) { RenderLayer* layer = n->renderer()->enclosingLayer(); layer->updateLayerPosition(); for (; layer; layer = layer->parent()) { m_layerX -= layer->x(); m_layerY -= layer->y(); } } }