Commit 0994bb89 authored by Maire Nicolas's avatar Maire Nicolas
Browse files

Rajout d'un preset animé.

parent cce1e8d4
...@@ -138,6 +138,10 @@ void Clipping::slot_explodTopoPhi3(double c) ...@@ -138,6 +138,10 @@ void Clipping::slot_explodTopoPhi3(double c)
void Clipping::slot_pushButton_addPlane() void Clipping::slot_pushButton_addPlane()
{ {
// Check if no animation is active
if (m_lastAnimatedClippingPreset != NULL)
return;
// Create clipping and pickable objects // Create clipping and pickable objects
unsigned int newPlaneId = m_shader->addClipPlane(); unsigned int newPlaneId = m_shader->addClipPlane();
Utils::Pickable* pickable = new Utils::Pickable(m_planeDrawable, newPlaneId); Utils::Pickable* pickable = new Utils::Pickable(m_planeDrawable, newPlaneId);
...@@ -176,6 +180,10 @@ void Clipping::slot_pushButton_changePlanesColor() ...@@ -176,6 +180,10 @@ void Clipping::slot_pushButton_changePlanesColor()
void Clipping::slot_pushButton_addSphere() void Clipping::slot_pushButton_addSphere()
{ {
// Check if no animation is active
if (m_lastAnimatedClippingPreset != NULL)
return;
// Create clipping and pickable objects // Create clipping and pickable objects
unsigned int newSphereId = m_shader->addClipSphere(); unsigned int newSphereId = m_shader->addClipSphere();
Utils::Pickable* pickable = new Utils::Pickable(m_sphereDrawable, newSphereId); Utils::Pickable* pickable = new Utils::Pickable(m_sphereDrawable, newSphereId);
...@@ -247,6 +255,10 @@ void Clipping::slot_radioButton_ColorAttenuationMode(bool b) ...@@ -247,6 +255,10 @@ void Clipping::slot_radioButton_ColorAttenuationMode(bool b)
void Clipping::slot_pushButton_deleteSelectedObject() void Clipping::slot_pushButton_deleteSelectedObject()
{ {
// Check if no animation is active
if (m_lastAnimatedClippingPreset != NULL)
return;
if (m_lastPickedObject) if (m_lastPickedObject)
{ {
// Delete clipping object // Delete clipping object
...@@ -293,12 +305,16 @@ void Clipping::slot_pushButton_deleteSelectedObject() ...@@ -293,12 +305,16 @@ void Clipping::slot_pushButton_deleteSelectedObject()
void Clipping::slot_pushButton_applyStaticClippingPreset() void Clipping::slot_pushButton_applyStaticClippingPreset()
{ {
// Check if no animation is active
if (m_lastAnimatedClippingPreset != NULL)
return;
// Create and apply preset // Create and apply preset
Utils::ClippingPreset *preset = NULL; Utils::ClippingPreset *preset = NULL;
switch (dock.comboBox_StaticClippingPresets->currentIndex()) switch (dock.comboBox_StaticClippingPresets->currentIndex())
{ {
case 0 : // Dual planes case 0 : // Dual planes
{ {
using namespace CGoGN::Utils::QT; using namespace CGoGN::Utils::QT;
double centerX = (double)m_bb.center()[0]; double centerX = (double)m_bb.center()[0];
...@@ -315,11 +331,11 @@ void Clipping::slot_pushButton_applyStaticClippingPreset() ...@@ -315,11 +331,11 @@ void Clipping::slot_pushButton_applyStaticClippingPreset()
VarBool(facing, "Facing" VarBool(facing, "Facing"
)))))), "Preset Setup")) )))))), "Preset Setup"))
preset = Utils::ClippingPreset::CreateDualPlanesPreset(Geom::Vec3f((float)centerX, (float)centerY, (float)centerZ), (float)size, axis, facing); preset = Utils::ClippingPreset::CreateDualPlanesPreset(Geom::Vec3f((float)centerX, (float)centerY, (float)centerZ), (float)size, axis, facing);
} }
break; break;
case 1 : // Cube case 1 : // Cube
{ {
using namespace CGoGN::Utils::QT; using namespace CGoGN::Utils::QT;
double centerX = (double)m_bb.center()[0]; double centerX = (double)m_bb.center()[0];
...@@ -334,11 +350,11 @@ void Clipping::slot_pushButton_applyStaticClippingPreset() ...@@ -334,11 +350,11 @@ void Clipping::slot_pushButton_applyStaticClippingPreset()
VarBool(facing, "Facing" VarBool(facing, "Facing"
))))), "Preset Setup")) ))))), "Preset Setup"))
preset = Utils::ClippingPreset::CreateCubePreset(Geom::Vec3f((float)centerX, (float)centerY, (float)centerZ), (float)size, facing); preset = Utils::ClippingPreset::CreateCubePreset(Geom::Vec3f((float)centerX, (float)centerY, (float)centerZ), (float)size, facing);
} }
break; break;
case 2 : // Tube case 2 : // Tube
{ {
using namespace CGoGN::Utils::QT; using namespace CGoGN::Utils::QT;
double centerX = (double)m_bb.center()[0]; double centerX = (double)m_bb.center()[0];
...@@ -357,11 +373,11 @@ void Clipping::slot_pushButton_applyStaticClippingPreset() ...@@ -357,11 +373,11 @@ void Clipping::slot_pushButton_applyStaticClippingPreset()
VarBool(facing, "Facing" VarBool(facing, "Facing"
))))))), "Preset Setup")) ))))))), "Preset Setup"))
preset = Utils::ClippingPreset::CreateTubePreset(Geom::Vec3f((float)centerX, (float)centerY, (float)centerZ), (float)size, axis, precision, facing); preset = Utils::ClippingPreset::CreateTubePreset(Geom::Vec3f((float)centerX, (float)centerY, (float)centerZ), (float)size, axis, precision, facing);
} }
break; break;
case 3 : // Molecule case 3 : // Molecule
{ {
using namespace CGoGN::Utils::QT; using namespace CGoGN::Utils::QT;
double centerX = (double)m_bb.center()[0]; double centerX = (double)m_bb.center()[0];
...@@ -378,8 +394,8 @@ void Clipping::slot_pushButton_applyStaticClippingPreset() ...@@ -378,8 +394,8 @@ void Clipping::slot_pushButton_applyStaticClippingPreset()
VarBool(orClipping, "OR clipping mode" VarBool(orClipping, "OR clipping mode"
)))))), "Preset Setup")) )))))), "Preset Setup"))
preset = Utils::ClippingPreset::CreateMoleculePreset(Geom::Vec3f((float)centerX, (float)centerY, (float)centerZ), (float)size, atomsRadiuses, orClipping); preset = Utils::ClippingPreset::CreateMoleculePreset(Geom::Vec3f((float)centerX, (float)centerY, (float)centerZ), (float)size, atomsRadiuses, orClipping);
} }
break; break;
} }
if (preset == NULL) if (preset == NULL)
...@@ -429,12 +445,16 @@ void Clipping::slot_pushButton_applyStaticClippingPreset() ...@@ -429,12 +445,16 @@ void Clipping::slot_pushButton_applyStaticClippingPreset()
void Clipping::slot_pushButton_applyAnimatedClippingPreset() void Clipping::slot_pushButton_applyAnimatedClippingPreset()
{ {
// Check if no animation is active
if (m_lastAnimatedClippingPreset != NULL)
return;
// Create and apply preset // Create and apply preset
Utils::ClippingPresetAnimated *animatedPreset = NULL; Utils::ClippingPresetAnimated *animatedPreset = NULL;
switch (dock.comboBox_AnimatedClippingPresets->currentIndex()) switch (dock.comboBox_AnimatedClippingPresets->currentIndex())
{ {
case 0 : // Moving Dual planes case 0 : // Moving Dual planes
{ {
Utils::ClippingPresetAnimatedDualPlanes *preset = NULL; Utils::ClippingPresetAnimatedDualPlanes *preset = NULL;
using namespace CGoGN::Utils::QT; using namespace CGoGN::Utils::QT;
...@@ -464,9 +484,29 @@ void Clipping::slot_pushButton_applyAnimatedClippingPreset() ...@@ -464,9 +484,29 @@ void Clipping::slot_pushButton_applyAnimatedClippingPreset()
(float)size, axis, facing, zigzag); (float)size, axis, facing, zigzag);
animatedPreset = preset; animatedPreset = preset;
} }
break; break;
case 1 : // Rotating Plane
{
Utils::ClippingPresetAnimatedRotatingPlane *preset = NULL;
using namespace CGoGN::Utils::QT;
double centerX = (double)m_bb.center()[0];
double centerY = (double)m_bb.center()[1];
double centerZ = (double)m_bb.center()[2];
int axis = 0;
if (inputValues(VarDbl(centerX - 100.0, centerX + 100.0, centerX, "Center X",
VarDbl(centerY - 100.0, centerY + 100.0, centerY, "Center Y",
VarDbl(centerZ - 100.0, centerZ + 100.0, centerZ, "Center Z",
VarSlider(0, 2, axis, "Axis"
)))), "Preset Setup"))
preset = new Utils::ClippingPresetAnimatedRotatingPlane(
Geom::Vec3f((float)centerX, (float)centerY, (float)centerZ), axis);
animatedPreset = preset;
}
break;
} }
...@@ -651,6 +691,7 @@ void Clipping::initGUI() ...@@ -651,6 +691,7 @@ void Clipping::initGUI()
setCallBack(dock.PushButton_ApplyAnimatedClippingPreset, SIGNAL(clicked()), SLOT(slot_pushButton_applyAnimatedClippingPreset())); setCallBack(dock.PushButton_ApplyAnimatedClippingPreset, SIGNAL(clicked()), SLOT(slot_pushButton_applyAnimatedClippingPreset()));
dock.comboBox_AnimatedClippingPresets->addItem("Moving Dual Planes"); dock.comboBox_AnimatedClippingPresets->addItem("Moving Dual Planes");
dock.comboBox_AnimatedClippingPresets->addItem("Rotating Plane");
setCallBack(dock.pushButton_StopAnimation, SIGNAL(clicked()), SLOT(slot_pushButton_StopAnimation())); setCallBack(dock.pushButton_StopAnimation, SIGNAL(clicked()), SLOT(slot_pushButton_StopAnimation()));
setCallBack(dock.doubleSpinBox_AnimatedClippingPresetSpeed, SIGNAL(valueChanged(double)), SLOT(slot_doubleSpinBox_AnimatedClippingPresetSpeed(double))); setCallBack(dock.doubleSpinBox_AnimatedClippingPresetSpeed, SIGNAL(valueChanged(double)), SLOT(slot_doubleSpinBox_AnimatedClippingPresetSpeed(double)));
...@@ -832,11 +873,25 @@ void Clipping::cb_keyPress(int code) ...@@ -832,11 +873,25 @@ void Clipping::cb_keyPress(int code)
case 16777223 : // Suppr case 16777223 : // Suppr
slot_pushButton_deleteSelectedObject(); slot_pushButton_deleteSelectedObject();
break; break;
case '+' :
dock.doubleSpinBox_AnimatedClippingPresetSpeed->setValue(
dock.doubleSpinBox_AnimatedClippingPresetSpeed->value() + 0.1);
break;
case '-' :
dock.doubleSpinBox_AnimatedClippingPresetSpeed->setValue(
dock.doubleSpinBox_AnimatedClippingPresetSpeed->value() - 0.1);
break;
} }
} }
void Clipping::cb_mousePress(int button, int x, int y) void Clipping::cb_mousePress(int button, int x, int y)
{ {
// Check if no animation is active
if (m_lastAnimatedClippingPreset != NULL)
return;
if (!Shift()) if (!Shift())
return; return;
...@@ -889,6 +944,10 @@ void Clipping::cb_mousePress(int button, int x, int y) ...@@ -889,6 +944,10 @@ void Clipping::cb_mousePress(int button, int x, int y)
void Clipping::cb_mouseMove(int buttons, int x, int y) void Clipping::cb_mouseMove(int buttons, int x, int y)
{ {
// Check if no animation is active
if (m_lastAnimatedClippingPreset != NULL)
return;
if (!Shift()) if (!Shift())
return; return;
......
...@@ -454,10 +454,10 @@ ...@@ -454,10 +454,10 @@
<item> <item>
<widget class="QDoubleSpinBox" name="doubleSpinBox_AnimatedClippingPresetSpeed"> <widget class="QDoubleSpinBox" name="doubleSpinBox_AnimatedClippingPresetSpeed">
<property name="minimum"> <property name="minimum">
<double>-10.000000000000000</double> <double>-100.000000000000000</double>
</property> </property>
<property name="maximum"> <property name="maximum">
<double>10.000000000000000</double> <double>100.000000000000000</double>
</property> </property>
<property name="singleStep"> <property name="singleStep">
<double>0.100000000000000</double> <double>0.100000000000000</double>
......
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
#include "Utils/clippingPresets.h" #include "Utils/clippingPresets.h"
#include "Utils/clippingShader.h" #include "Utils/clippingShader.h"
#include "Geometry/vector_gen.h" #include "Geometry/vector_gen.h"
#include <cmath>
namespace CGoGN namespace CGoGN
{ {
...@@ -154,6 +155,31 @@ private : ...@@ -154,6 +155,31 @@ private :
}; };
class ClippingPresetAnimatedRotatingPlane : public ClippingPresetAnimated
{
public :
/**
* constructor
* @param center center of plane
* @param axis axis on which plane is aligned (0 for x, 1 for y, 2 for z)
*/
ClippingPresetAnimatedRotatingPlane(Geom::Vec3f center, int axis);
/**
* runs the animation some steps further
* @param amount amount of steps the animation should do
*/
void step(unsigned int amount);
private :
/// axis of plane
int m_axis;
};
} // namespace Utils } // namespace Utils
......
...@@ -158,6 +158,60 @@ void ClippingPresetAnimatedDualPlanes::step(unsigned int amount) ...@@ -158,6 +158,60 @@ void ClippingPresetAnimatedDualPlanes::step(unsigned int amount)
m_attachedClippingShader->setClipPlaneParamsOrigin(m_planesIds[1], plane2CurrPos + newCenter - oldCenter); m_attachedClippingShader->setClipPlaneParamsOrigin(m_planesIds[1], plane2CurrPos + newCenter - oldCenter);
} }
ClippingPresetAnimatedRotatingPlane::ClippingPresetAnimatedRotatingPlane(Geom::Vec3f center, int axis)
{
// Correct axis if necessary and store it
if ((axis < 0) || (axis > 2))
axis = 0;
m_axis = axis;
// Axis on which planes will be aligned
Geom::Vec3f normal (0.0f, 0.0f, 0.0f);
normal[(axis + 1) % 3] = 1.0f;
// Add plane to preset
addClipPlane(normal, center);
// Set clipping mode
setClippingMode(ClippingShader::CLIPPING_MODE_AND);
}
void ClippingPresetAnimatedRotatingPlane::step(unsigned int amount)
{
// Check if the animation has been stopped
if (m_animationSpeedFactor == 0.0f)
return;
// Check the validity of planes or spheres ids
if (!m_attachedClippingShader->isClipPlaneIdValid(m_planesIds[0]))
{
CGoGNerr
<< "ERROR -"
<< "ClippingPresetAnimatedDualPlanes::step"
<< " - Some planes or spheres ids are not valid anymore - Animation stopped"
<< CGoGNendl;
m_animationSpeedFactor = 0.0f;
return;
}
// Update animation parameter value
m_animParam += (float)amount * m_animationOneStepIncrement * m_animationSpeedFactor;
while (m_animParam < 0.0f)
m_animParam += 1.0f;
while (m_animParam > 1.0f)
m_animParam -= 1.0f;
// Calculate new normal
Geom::Vec3f planeNormal = m_attachedClippingShader->getClipPlaneParamsNormal(m_planesIds[0]);
float angle = m_animParam*2.0*M_PI;
planeNormal[(m_axis + 1) % 3] = cos(angle);
planeNormal[(m_axis + 2) % 3] = sin(angle);
m_attachedClippingShader->setClipPlaneParamsNormal(m_planesIds[0], planeNormal);
}
} // namespace Utils } // namespace Utils
} // namespace CGoGN } // namespace CGoGN
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment