+ methods to highlight points, edges or faces of a shape

This commit is contained in:
wmayer 2016-05-09 23:48:30 +02:00
parent f5b707e9a2
commit 59980c33d1
2 changed files with 136 additions and 60 deletions

View File

@ -373,7 +373,7 @@ void ViewProviderPartExt::onChanged(const App::Property* prop)
else if (prop == &PointMaterial) {
const App::Material& Mat = PointMaterial.getValue();
if (PointColor.getValue() != Mat.diffuseColor)
PointColor.setValue(Mat.diffuseColor);
PointColor.setValue(Mat.diffuseColor);
pcPointMaterial->ambientColor.setValue(Mat.ambientColor.r,Mat.ambientColor.g,Mat.ambientColor.b);
pcPointMaterial->diffuseColor.setValue(Mat.diffuseColor.r,Mat.diffuseColor.g,Mat.diffuseColor.b);
pcPointMaterial->specularColor.setValue(Mat.specularColor.r,Mat.specularColor.g,Mat.specularColor.b);
@ -382,65 +382,13 @@ void ViewProviderPartExt::onChanged(const App::Property* prop)
pcPointMaterial->transparency.setValue(Mat.transparency);
}
else if (prop == &PointColorArray) {
const std::vector<App::Color>& c = PointColorArray.getValues();
unsigned int size = (int)c.size();
if (size > 1) {
// FIXME: Check for size mismatch between number of points and number of colors
pcShapeBind->value = SoMaterialBinding::PER_VERTEX;
pcPointMaterial->diffuseColor.setNum(size);
SbColor* ca = pcPointMaterial->diffuseColor.startEditing();
for (unsigned int i=0; i < size; ++i)
ca[i].setValue(c[i].r,c[i].g,c[i].b);
pcPointMaterial->diffuseColor.finishEditing();
}
else if (size == 1) {
pcShapeBind->value = SoMaterialBinding::OVERALL;
pcPointMaterial->diffuseColor.setValue(c[0].r,c[0].g,c[0].b);
}
setHighlightedPoints(PointColorArray.getValues());
}
else if (prop == &LineColorArray) {
const std::vector<App::Color>& c = LineColorArray.getValues();
int size = (int)c.size();
if (size > 1) {
pcLineBind->value = SoMaterialBinding::PER_PART;
const int32_t* cindices = this->lineset->coordIndex.getValues(0);
int numindices = this->lineset->coordIndex.getNum();
pcLineMaterial->diffuseColor.setNum(size);
SbColor* ca = pcLineMaterial->diffuseColor.startEditing();
int linecount = 0;
for (int i = 0; i < numindices; ++i) {
if (cindices[i] < 0) {
ca[linecount].setValue(c[linecount].r,c[linecount].g,c[linecount].b);
linecount++;
if (linecount >= size)
break;
}
}
pcLineMaterial->diffuseColor.finishEditing();
}
else if (size == 1) {
pcLineBind->value = SoMaterialBinding::OVERALL;
pcLineMaterial->diffuseColor.setValue(c[0].r,c[0].g,c[0].b);
}
setHighlightedEdges(LineColorArray.getValues());
}
// For testing
else if (prop == &DiffuseColor) {
const std::vector<App::Color>& c = DiffuseColor.getValues();
int size = static_cast<int>(c.size());
if (size > 1 && size == this->faceset->partIndex.getNum()) {
pcShapeBind->value = SoMaterialBinding::PER_PART;
pcShapeMaterial->diffuseColor.setNum(size);
SbColor* ca = pcShapeMaterial->diffuseColor.startEditing();
for (int i=0; i < size; i++)
ca[i].setValue(c[i].r,c[i].g,c[i].b);
pcShapeMaterial->diffuseColor.finishEditing();
}
else if (c.size() == 1) {
pcShapeBind->value = SoMaterialBinding::OVERALL;
pcShapeMaterial->diffuseColor.setValue(c[0].r,c[0].g,c[0].b);
}
setHighlightedFaces(DiffuseColor.getValues());
}
else if (prop == &ShapeMaterial || prop == &ShapeColor) {
pcShapeBind->value = SoMaterialBinding::OVERALL;
@ -691,6 +639,121 @@ std::vector<Base::Vector3d> ViewProviderPartExt::getSelectionShape(const char* E
return std::vector<Base::Vector3d>();
}
void ViewProviderPartExt::setHighlightedFaces(const std::vector<App::Color>& colors)
{
int size = static_cast<int>(colors.size());
if (size > 1 && size == this->faceset->partIndex.getNum()) {
pcShapeBind->value = SoMaterialBinding::PER_PART;
pcShapeMaterial->diffuseColor.setNum(size);
SbColor* ca = pcShapeMaterial->diffuseColor.startEditing();
for (int i = 0; i < size; i++)
ca[i].setValue(colors[i].r, colors[i].g, colors[i].b);
pcShapeMaterial->diffuseColor.finishEditing();
}
else if (colors.size() == 1) {
pcShapeBind->value = SoMaterialBinding::OVERALL;
pcShapeMaterial->diffuseColor.setValue(colors[0].r, colors[0].g, colors[0].b);
}
}
void ViewProviderPartExt::setHighlightedFaces(const std::vector<App::Material>& colors)
{
int size = static_cast<int>(colors.size());
if (size > 1 && size == this->faceset->partIndex.getNum()) {
pcShapeBind->value = SoMaterialBinding::PER_PART;
pcShapeMaterial->diffuseColor.setNum(size);
pcShapeMaterial->ambientColor.setNum(size);
pcShapeMaterial->specularColor.setNum(size);
pcShapeMaterial->emissiveColor.setNum(size);
SbColor* dc = pcShapeMaterial->diffuseColor.startEditing();
SbColor* ac = pcShapeMaterial->ambientColor.startEditing();
SbColor* sc = pcShapeMaterial->specularColor.startEditing();
SbColor* ec = pcShapeMaterial->emissiveColor.startEditing();
for (int i = 0; i < size; i++) {
dc[i].setValue(colors[i].diffuseColor.r, colors[i].diffuseColor.g, colors[i].diffuseColor.b);
ac[i].setValue(colors[i].ambientColor.r, colors[i].ambientColor.g, colors[i].ambientColor.b);
sc[i].setValue(colors[i].specularColor.r, colors[i].specularColor.g, colors[i].specularColor.b);
ec[i].setValue(colors[i].emissiveColor.r, colors[i].emissiveColor.g, colors[i].emissiveColor.b);
}
pcShapeMaterial->diffuseColor.finishEditing();
pcShapeMaterial->ambientColor.finishEditing();
pcShapeMaterial->specularColor.finishEditing();
pcShapeMaterial->emissiveColor.finishEditing();
}
else if (colors.size() == 1) {
pcShapeBind->value = SoMaterialBinding::OVERALL;
pcShapeMaterial->diffuseColor.setValue(colors[0].diffuseColor.r, colors[0].diffuseColor.g, colors[0].diffuseColor.b);
pcShapeMaterial->ambientColor.setValue(colors[0].ambientColor.r, colors[0].ambientColor.g, colors[0].ambientColor.b);
pcShapeMaterial->specularColor.setValue(colors[0].specularColor.r, colors[0].specularColor.g, colors[0].specularColor.b);
pcShapeMaterial->emissiveColor.setValue(colors[0].emissiveColor.r, colors[0].emissiveColor.g, colors[0].emissiveColor.b);
}
}
void ViewProviderPartExt::unsetHighlightedFaces()
{
ShapeMaterial.touch();
}
void ViewProviderPartExt::setHighlightedEdges(const std::vector<App::Color>& colors)
{
int size = static_cast<int>(colors.size());
if (size > 1) {
pcLineBind->value = SoMaterialBinding::PER_PART;
const int32_t* cindices = this->lineset->coordIndex.getValues(0);
int numindices = this->lineset->coordIndex.getNum();
pcLineMaterial->diffuseColor.setNum(size);
SbColor* ca = pcLineMaterial->diffuseColor.startEditing();
int linecount = 0;
for (int i = 0; i < numindices; ++i) {
if (cindices[i] < 0) {
ca[linecount].setValue(colors[linecount].r, colors[linecount].g, colors[linecount].b);
linecount++;
if (linecount >= size)
break;
}
}
pcLineMaterial->diffuseColor.finishEditing();
}
else if (size == 1) {
pcLineBind->value = SoMaterialBinding::OVERALL;
pcLineMaterial->diffuseColor.setValue(colors[0].r, colors[0].g, colors[0].b);
}
}
void ViewProviderPartExt::unsetHighlightedEdges()
{
LineMaterial.touch();
}
void ViewProviderPartExt::setHighlightedPoints(const std::vector<App::Color>& colors)
{
int size = static_cast<int>(colors.size());
if (size > 1) {
// FIXME: Check for size mismatch between number of points and number of colors
pcShapeBind->value = SoMaterialBinding::PER_VERTEX;
pcPointMaterial->diffuseColor.setNum(size);
SbColor* ca = pcPointMaterial->diffuseColor.startEditing();
for (int i = 0; i < size; ++i)
ca[i].setValue(colors[i].r, colors[i].g, colors[i].b);
pcPointMaterial->diffuseColor.finishEditing();
}
else if (size == 1) {
pcShapeBind->value = SoMaterialBinding::OVERALL;
pcPointMaterial->diffuseColor.setValue(colors[0].r, colors[0].g, colors[0].b);
}
}
void ViewProviderPartExt::unsetHighlightedPoints()
{
PointMaterial.touch();
}
bool ViewProviderPartExt::loadParameter()
{
bool changed = false;

View File

@ -99,10 +99,10 @@ public:
virtual void updateData(const App::Property*);
/** @name Selection handling
* This group of methodes do the selection handling.
* Here you can define how the selection for your ViewProfider
* works.
/** @name Selection handling
* This group of methods do the selection handling.
* Here you can define how the selection for your ViewProfider
* works.
*/
//@{
/// indicates if the ViewProvider use the new Selection model
@ -115,6 +115,19 @@ public:
virtual std::vector<Base::Vector3d> getSelectionShape(const char* Element) const;
//@}
/** @name Highlight handling
* This group of methods do the highlighting of elements.
*/
//@{
void setHighlightedFaces(const std::vector<App::Color>& colors);
void setHighlightedFaces(const std::vector<App::Material>& colors);
void unsetHighlightedFaces();
void setHighlightedEdges(const std::vector<App::Color>& colors);
void unsetHighlightedEdges();
void setHighlightedPoints(const std::vector<App::Color>& colors);
void unsetHighlightedPoints();
//@}
/** @name Edit methods */
//@{
void setupContextMenu(QMenu*, QObject*, const char*);