summaryrefslogtreecommitdiff
path: root/src/pmview/pcpcolor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/pmview/pcpcolor.cpp')
-rw-r--r--src/pmview/pcpcolor.cpp100
1 files changed, 100 insertions, 0 deletions
diff --git a/src/pmview/pcpcolor.cpp b/src/pmview/pcpcolor.cpp
new file mode 100644
index 0000000..85a313e
--- /dev/null
+++ b/src/pmview/pcpcolor.cpp
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 1997 Silicon Graphics, Inc. All Rights Reserved.
+ * Copyright (c) 2009 Aconex. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * for more details.
+ */
+#include <Inventor/actions/SoCallbackAction.h>
+#include <Inventor/actions/SoGLRenderAction.h>
+#include <Inventor/bundles/SoMaterialBundle.h>
+#include <Inventor/elements/SoEmissiveColorElement.h>
+
+#include "pcpcolor.h"
+#include "scenegroup.h"
+#include "main.h"
+
+SO_NODE_SOURCE(PCPColor);
+// Initializes the PCPColor class. This is a one-time thing that is
+// done after database initialization and before any instance of
+// this class is constructed.
+void
+PCPColor::initClass()
+{
+ // Initialize type id variables. The arguments to the macro
+ // are: the name of the node class, the class this is derived
+ // from, and the name registered with the type of the parent
+ // class.
+ SO_NODE_INIT_CLASS(PCPColor, SoNode, "Node");
+}
+// Constructor
+PCPColor::PCPColor()
+{
+ // Do standard constructor tasks
+ SO_NODE_CONSTRUCTOR(PCPColor);
+
+ SO_NODE_ADD_FIELD(maxValue, (1.0));
+ SO_NODE_ADD_FIELD(color, (1.0, 1.0, 1.0));
+ SO_NODE_ADD_FIELD(metric, (""));
+
+ // SbString s = metric.getValue();
+ SbString *s = new SbString("kernel.all.cpu.user");
+
+ double scale = (double)maxValue.getValue();
+ theMetric = new QmcMetric(activeGroup, s->getString(), scale);
+ elementalNodeList.append(this);
+}
+// Destructor
+PCPColor::~PCPColor()
+{
+}
+// Implements GL render action.
+void
+PCPColor::GLRender(SoGLRenderAction *action)
+{
+ // Set the elements in the state correctly. Note that we
+ // prefix the call to doAction() with the class name. This
+ // avoids problems if someone derives a new class from the
+ // PCPColor node and inherits the GLRender() method; PCPColor's
+ // doAction() will still be called in that case.
+
+ PCPColor::doAction(action);
+
+ // For efficiency, Inventor nodes make sure that the first
+ // defined material is always in GL, so shapes do not have to
+ // send the first material each time. (This keeps caches from
+ // being dependent on material values in many cases.) The
+ // SoMaterialBundle class allows us to do this easily.
+ SoMaterialBundle mb(action);
+ mb.forceSend(0);
+}
+// Implements callback action.
+void
+PCPColor::callback(SoCallbackAction *action)
+{
+ // Set the elements in the state correctly.
+ PCPColor::doAction(action);
+}
+
+// Typical action implementation - it sets the correct element
+// in the action's traversal state. We assume that the element
+// has been enabled.
+void
+PCPColor::doAction(SoAction *action)
+{
+ theMetric->update();
+ float f = theMetric->realValue(0);
+ f /= maxValue.getValue() + 0.001;
+ emissiveColor = color.getValue() * f;
+ if (action->getState())
+ SoEmissiveColorElement::set(action->getState(), this, 1, &emissiveColor);
+
+ touch();
+}