On 11/01/2015 at 09:13, xxxxxxxx wrote:
Scott, indeed, these nodes are classes I wrote. The base class establishes a doubly-linked list set up (for easy insertion/deletion of nodes), position and size of the node graphically, inputs and outputs as NodeInput classes for connectivity, node ids, flags, methods, and other information. The code is rather old and I would probably do it differently today having learned much over time.
////////////////////////////////////////////////////////////////
// NodeInput.h
////////////////////////////////////////////////////////////////
// Node Input Class include
////////////////////////////////////////////////////////////////
#ifndef _NODEINPUT_H_
#define _NODEINPUT_H_
#include "ShaderNodeDefs.h"
// Predefine for cross-referencing
class ShaderNode;
// Input within Node
class NodeInput
{
private:
// NodeInput name
String name;
// Vector(x,y,z), Color(R,G,B), Value(current,min,max), List(current,listtype,numitems)
Vector value;
// Value Type - see NodeInput Type Defintions in ShaderNodeDefs
LONG type;
// Whether Node accepts input connections
Bool acceptConnection;
// ShaderNodes connected to this NodeInput
LONG numNodes;
ShaderNode* node;
// - id of ShaderNode (for Read/Write/CopyTo)
LONG id;
// ID of corresponding Edit Gadget in Dialog
LONG editID;
// Name of bitmap file
String file;
public:
NodeInput();
~NodeInput();
// Initialize NodeInput
void Init(const String& t_name, const Vector& t_value, const LONG& t_type, const Bool& t_acceptConnection, ShaderNode* t_node, const String& t_file);
// String name
void SetName(const String& t_name);
String GetName();
// Vector value
void SetValue(const Vector& t_value);
void SetValueBool(const Bool& t_value);
void SetValueList(const LONG& t_value);
void SetValueReal(const Real& t_value);
Vector GetValue();
Bool GetValueBool();
LONG GetValueList();
Real GetValueReal();
// LONG type
Bool IsInstanceOf(const LONG& t_type);
void SetType(const LONG& t_type);
LONG GetType();
// Bool acceptConnection
void SetAcceptConnection(const Bool& t_acceptConnection);
Bool GetAcceptConnection();
// ShaderNode *node
void SetNode(ShaderNode* t_node);
ShaderNode* GetNode();
void SetNodeID(const LONG& t_id);
LONG GetNodeID();
// String file
void SetFile(String t_file);
String GetFile();
// LONG editID
void SetEditID(const LONG& t_editID);
LONG GetEditID();
// Read/Write/CopyTo
Bool Read(HyperFile* hf, LONG level);
Bool Write(HyperFile* hf);
Bool CopyTo(NodeInput* dni, Bool dataOnly);
};
#endif //_NODEINPUT_H_
////////////////////////////////////////////////////////////////
// NodeInput.cpp
////////////////////////////////////////////////////////////////
// Node Input Class
////////////////////////////////////////////////////////////////
// Includes
#include "../glload.h"
#include "../general.h"
#include "NodeInput.h"
#include "ShaderNode.h"
// ****************************************************************************
// METHODS: NodeInput
// Constructor #1
//*---------------------------------------------------------------------------*
NodeInput::NodeInput()
//*---------------------------------------------------------------------------*
{
name = String("");
value = Vector(0.0);
type = NODEINPUTTYPE_NONE;
acceptConnection = FALSE;
numNodes = 0L;
node = NULL;
id = -1L;
file = String("");
editID = -1L;
}
// Destructor
//*---------------------------------------------------------------------------*
NodeInput::~NodeInput()
//*---------------------------------------------------------------------------*
{
}
// Initialize NodeInput
//*---------------------------------------------------------------------------*
void NodeInput::Init(const String& t_name, const Vector& t_value, const LONG& t_type, const Bool& t_acceptConnection, ShaderNode* t_node, const String& t_file)
//*---------------------------------------------------------------------------*
{
name = t_name;
value = Vector(t_value.x, t_value.y, t_value.z);
type = t_type;
acceptConnection = t_acceptConnection;
node = t_node;
if (node) id = node->GetID();
else id = -1L;
file = t_file;
}
// String name
//*---------------------------------------------------------------------------*
void NodeInput::SetName(const String& t_name)
//*---------------------------------------------------------------------------*
{
name = t_name;
}
//*---------------------------------------------------------------------------*
String NodeInput::GetName()
//*---------------------------------------------------------------------------*
{
return name;
}
// Vector value
//*---------------------------------------------------------------------------*
void NodeInput::SetValue(const Vector& t_value)
//*---------------------------------------------------------------------------*
{
value = Vector(t_value.x, t_value.y, t_value.z);
}
//*---------------------------------------------------------------------------*
void NodeInput::SetValueBool(const Bool& t_value)
//*---------------------------------------------------------------------------*
{
value.x = (Real)t_value;
}
//*---------------------------------------------------------------------------*
void NodeInput::SetValueList(const LONG& t_value)
//*---------------------------------------------------------------------------*
{
value.x = (Real)t_value;
}
//*---------------------------------------------------------------------------*
void NodeInput::SetValueReal(const Real& t_value)
//*---------------------------------------------------------------------------*
{
value.x = t_value;
}
//*---------------------------------------------------------------------------*
Vector NodeInput::GetValue()
//*---------------------------------------------------------------------------*
{
return value;
}
//*---------------------------------------------------------------------------*
Bool NodeInput::GetValueBool()
//*---------------------------------------------------------------------------*
{
return (Bool)(value.x);
}
//*---------------------------------------------------------------------------*
LONG NodeInput::GetValueList()
//*---------------------------------------------------------------------------*
{
return (LONG)(value.x);
}
//*---------------------------------------------------------------------------*
Real NodeInput::GetValueReal()
//*---------------------------------------------------------------------------*
{
return value.x;
}
// Bool acceptConnection
//*---------------------------------------------------------------------------*
void NodeInput::SetAcceptConnection(const Bool& t_acceptConnection)
//*---------------------------------------------------------------------------*
{
acceptConnection = t_acceptConnection;
}
//*---------------------------------------------------------------------------*
Bool NodeInput::GetAcceptConnection()
//*---------------------------------------------------------------------------*
{
return acceptConnection;
}
// LONG type
//*---------------------------------------------------------------------------*
Bool NodeInput::IsInstanceOf(const LONG& t_type)
//*---------------------------------------------------------------------------*
{
return (type == t_type);
}
//*---------------------------------------------------------------------------*
void NodeInput::SetType(const LONG& t_type)
//*---------------------------------------------------------------------------*
{
type = t_type;
}
//*---------------------------------------------------------------------------*
LONG NodeInput::GetType()
//*---------------------------------------------------------------------------*
{
return type;
}
// ShaderNode* node
//*---------------------------------------------------------------------------*
void NodeInput::SetNode(ShaderNode* t_node)
//*---------------------------------------------------------------------------*
{
node = t_node;
if (node) id = node->GetID();
else id = -1L;
}
//*---------------------------------------------------------------------------*
ShaderNode* NodeInput::GetNode()
//*---------------------------------------------------------------------------*
{
return node;
}
//*---------------------------------------------------------------------------*
void NodeInput::SetNodeID(const LONG& t_id)
//*---------------------------------------------------------------------------*
{
id = t_id;
}
//*---------------------------------------------------------------------------*
LONG NodeInput::GetNodeID()
//*---------------------------------------------------------------------------*
{
return id;
}
// String file
//*---------------------------------------------------------------------------*
void NodeInput::SetFile(String t_file)
//*---------------------------------------------------------------------------*
{
file = t_file;
}
//*---------------------------------------------------------------------------*
String NodeInput::GetFile()
//*---------------------------------------------------------------------------*
{
return file;
}
// LONG editID
//*---------------------------------------------------------------------------*
void NodeInput::SetEditID(const LONG& t_editID)
//*---------------------------------------------------------------------------*
{
editID = t_editID;
}
//*---------------------------------------------------------------------------*
LONG NodeInput::GetEditID()
//*---------------------------------------------------------------------------*
{
return editID;
}
// Read/Write/CopyTo
// - Read NodeInput info
//*---------------------------------------------------------------------------*
Bool NodeInput::Read(HyperFile* hf, LONG level)
//*---------------------------------------------------------------------------*
{
if (!hf->ReadString(&name)) return FALSE;
if (!hf->ReadVector(&value)) return FALSE;
if (!hf->ReadLong(&type)) return FALSE;
if (!hf->ReadBool(&acceptConnection)) return FALSE;
// ShaderNode* node - Unique Index!
if (!hf->ReadLong(&id)) return FALSE;
if (!hf->ReadString(&file)) return FALSE;
return TRUE;
}
// - Write NodeInput info
//*---------------------------------------------------------------------------*
Bool NodeInput::Write(HyperFile* hf)
//*---------------------------------------------------------------------------*
{
if (!hf->WriteString(name)) return FALSE;
if (!hf->WriteVector(value)) return FALSE;
if (!hf->WriteLong(type)) return FALSE;
if (!hf->WriteBool(acceptConnection)) return FALSE;
// ShaderNode* node - Unique Index!
if (!hf->WriteLong(id)) return FALSE;
if (!hf->WriteString(file)) return FALSE;
return TRUE;
}
// - Copy Source NodeInput info to Destination NodeInput
//*---------------------------------------------------------------------------*
Bool NodeInput::CopyTo(NodeInput* dni, Bool dataOnly)
//*---------------------------------------------------------------------------*
{
dni->name = name;
dni->value = Vector(value.x, value.y, value.z);
dni->type = type;
dni->acceptConnection = acceptConnection;
dni->file = file;
if (!dataOnly) dni->id = id;
return TRUE;
}
////////////////////////////////////////////////////////////////
// ShaderNode.h
////////////////////////////////////////////////////////////////
// Shader Node Base Class include
////////////////////////////////////////////////////////////////
#ifndef _SHADERNODE_H_
#define _SHADERNODE_H_
#include "ShaderNodeDefs.h"
// ShaderNode flags
#define SHADERNODE_FLAGS_NONE 0L
#define SHADERNODE_FLAGS_SHOWPREVIEW (1<<0)
#define SHADERNODE_FLAGS_SELECTED (1<<1)
#define SHADERNODE_FLAGS_CONNECTING (1<<2)
#define SHADERNODE_FLAGS_EXPANDED (1<<3)
//class glload;
class NodeInput;
struct NodeInputDef;
// Node within Tree
class ShaderNode
{
public:
ShaderNode* prev;
ShaderNode* next;
// - ShaderNode name
String name;
// - UL Position within interface
LONG xPos;
LONG yPos;
// - Unique ID
LONG id;
// - Flags (see above)
LONG flags;
// - Node Type - see ShaderNode Type Definitions in ShaderNodeDefs
LONG type;
// NodeInputs: count
LONG numNodeInputs;
LONG acceptCount;
// Number of outgoing connections
LONG connections;
NodeInput* nodeInputs;
// OpenGL Support
//glload* previewGL;
// Bitmaps
BaseBitmap* previewBitmap;
// For Output()
ShaderNode* sn;
NodeInput* ni;
// Methods
ShaderNode();
ShaderNode(const LONG& t_type, const LONG& t_numNodeInputs, const LONG& t_xPos, const LONG& t_yPos, const LONG& t_flags);
virtual ~ShaderNode();
Bool Append(ShaderNode* previous);
void Remove();
ShaderNode* GetPrev();
ShaderNode* GetNext();
// Initial ShaderNode
Bool Init(const LONG& t_xPos, const LONG& t_yPos, const LONG& t_pDim, const LONG& t_flags);
Bool InitInputs(NodeInputDef* nid);
// String name
void SetName(const String& t_name);
String GetName();
// Vector pos
void SetPos(const LONG& t_xPos, const LONG& t_yPos);
void GetPos(LONG* t_xPos, LONG* t_yPos);
void Move(const LONG& xDelta, const LONG& yDelta);
// LONG id
void SetID(const LONG& t_id);
LONG GetID();
// Bool showPreview
void SetShowPreview(const Bool& t_showPreview);
Bool GetShowPreview();
void InvertShowPreview();
// Bool selected
void SetSelected(const Bool& t_selected);
Bool GetSelected();
// Bool expanded
void SetExpanded(const Bool& t_expanded);
Bool GetExpanded();
void InvertExpanded();
// LONG type
Bool IsInstanceOf(const LONG& t_type);
void SetType(const LONG& t_type);
LONG GetType();
// NodeInputs
LONG GetNodeCount();
LONG GetAcceptCount();
void ClearInputs();
// LONG connections
void SetConnections(const LONG& count);
void IncConnect();
void DecConnect();
LONG Connected();
// Bool connecting
void SetConnecting(const Bool& t_connecting);
Bool IsConnecting();
// NodeInput *nodeInputs - retrieve by index
NodeInput* GetNodeInput(LONG index=0L);
// Read/Write/CopyTo
Bool Read(HyperFile* hf, LONG level);
Bool Write(HyperFile* hf);
Bool CopyTo(ShaderNode* dsn, Bool uniqueID);
void ReestablishNodeLinks(ShaderNode* firstSNode);
// Preview Bitmap
BaseBitmap* GetPreview();
// Pure Virtuals (no more)
void SetPreview(BaseMaterial* chn, Bool fromFile);
Vector Output(BaseMaterial* chn, ChannelData* cd);
};
#endif //_SHADERNODE_H_
////////////////////////////////////////////////////////////////
// ShaderNode.cpp
////////////////////////////////////////////////////////////////
// Shader Node and Node Input Class
////////////////////////////////////////////////////////////////
// Includes
//#include "../glload.h"
#include "../general.h"
#include "NodeInputDefs.h"
#include "NodeInput.h"
#include "ShaderNode.h"
#include "ShaderNodeStr.h"
// ****************************************************************************
// METHODS: ShaderNode
// Constructor #1
//*---------------------------------------------------------------------------*
ShaderNode::ShaderNode()
//*---------------------------------------------------------------------------*
{
nodeInputs = NULL;
previewBitmap = NULL;
//previewGL = NULL;
prev = NULL;
next = NULL;
xPos = 0L;
yPos = 0L;
flags = SHADERNODE_FLAGS_NONE;
type = SHADERNODETYPE_NONE;
numNodeInputs = 0L;
acceptCount = 0L;
connections = 0L;
}
// Constructor #2
//*---------------------------------------------------------------------------*
ShaderNode::ShaderNode(const LONG& t_type, const LONG& t_numNodeInputs, const LONG& t_xPos, const LONG& t_yPos, const LONG& t_flags)
//*---------------------------------------------------------------------------*
{
nodeInputs = NULL;
previewBitmap = NULL;
//previewGL = NULL;
prev = NULL;
next = NULL;
xPos = t_xPos;
yPos = t_yPos;
flags = t_flags;
type = t_type;
numNodeInputs = t_numNodeInputs;
acceptCount = 0L;
connections = 0L;
}
// Destructor
//*---------------------------------------------------------------------------*
ShaderNode::~ShaderNode()
//*---------------------------------------------------------------------------*
{
//gDelete(previewGL);
BaseBitmap::Free(previewBitmap);
bDelete(nodeInputs);
}
// Append node to list
//*---------------------------------------------------------------------------*
Bool ShaderNode::Append(ShaderNode* previous)
//*---------------------------------------------------------------------------*
{
if (!previous) return ErrorException::Throw(GeLoadString(CANERR_MEMORY), "ShaderNode.Append.previous");
prev = previous;
previous->next = this;
return TRUE;
}
// Remove node from list
//*---------------------------------------------------------------------------*
void ShaderNode::Remove()
//*---------------------------------------------------------------------------*
{
ShaderNode* p = prev;
ShaderNode* n = next;
prev = NULL;
next = NULL;
if (p) p->next = n;
if (n) n->prev = p;
}
// Get Previous node
//*---------------------------------------------------------------------------*
ShaderNode* ShaderNode::GetPrev()
//*---------------------------------------------------------------------------*
{
return prev;
}
// Get Next node
//*---------------------------------------------------------------------------*
ShaderNode* ShaderNode::GetNext()
//*---------------------------------------------------------------------------*
{
return next;
}
// Initialize ShaderNode
//*---------------------------------------------------------------------------*
Bool ShaderNode::Init(const LONG& t_xPos, const LONG& t_yPos, const LONG& t_pDim, const LONG& t_flags)
//*---------------------------------------------------------------------------*
{
if (!previewBitmap)
{
previewBitmap = BaseBitmap::Alloc();
if (!previewBitmap) return ErrorException::Throw(GeLoadString(CANERR_MEMORY), "ShaderNode.Init.previewBitmap");
if (previewBitmap->Init(t_pDim, t_pDim, 32L) != IMAGERESULT_OK)
return ErrorException::Throw(GeLoadString(CANERR_MEMORY), "ShaderNode.Init.previewBitmap.Init");
previewBitmap->Clear(255L,255L,255L);
}
/*
if (!previewGL)
{
previewGL = gNew glload;
if (!previewGL) return ErrorException::Throw(GeLoadString(CANERR_MEMORY), "ShaderNode.Init.previewGL");
if (!previewGL->Init()) return ErrorException::Throw(GeLoadString(CANERR_GENERAL), "ShaderNode.Init.previewGL.Init");
}
*/
name = ShaderNodeStrings[type];
xPos = t_xPos;
yPos = t_yPos;
flags = t_flags;
return TRUE;
}
// Initialize ShaderNode Inputs
//*---------------------------------------------------------------------------*
Bool ShaderNode::InitInputs(NodeInputDef* nid)
//*---------------------------------------------------------------------------*
{
// Initialize NodeInputs by ShaderNode type
// - Delete default NodeInput array
bDelete(nodeInputs);
nodeInputs = NULL;
if (!numNodeInputs) return ErrorException::Throw(GeLoadString(CANERR_GENERAL), "ShaderNode.InitInputs.numNodeInputs");
// - Allocate NodeInput array
nodeInputs = bNew NodeInput[numNodeInputs];
if (!nodeInputs) return ErrorException::Throw(GeLoadString(CANERR_MEMORY), "ShaderNode.InitInputs.nodeInputs");
// - Configure NodeInput array
for (LONG i = 0L; i != numNodeInputs; ++i)
{
nodeInputs[i].Init(nid[i].name, Vector(nid[i].a, nid[i].b, nid[i].c), nid[i].type, nid[i].accept, NULL, String(""));
if (nid[i].accept) ++acceptCount;
}
return TRUE;
}
// String name
//*---------------------------------------------------------------------------*
void ShaderNode::SetName(const String& t_name)
//*---------------------------------------------------------------------------*
{
name = t_name;
}
//*---------------------------------------------------------------------------*
String ShaderNode::GetName()
//*---------------------------------------------------------------------------*
{
return name;
}
// LONG xPos, yPos
//*---------------------------------------------------------------------------*
void ShaderNode::SetPos(const LONG& t_xPos, const LONG& t_yPos)
//*---------------------------------------------------------------------------*
{
xPos = t_xPos;
yPos = t_yPos;
}
//*---------------------------------------------------------------------------*
void ShaderNode::GetPos(LONG* t_xPos, LONG* t_yPos)
//*---------------------------------------------------------------------------*
{
*t_xPos = xPos;
*t_yPos = yPos;
}
//*---------------------------------------------------------------------------*
void ShaderNode::Move(const LONG& xDelta, const LONG& yDelta)
//*---------------------------------------------------------------------------*
{
// Move position by amount
xPos += xDelta;
yPos += yDelta;
}
// LONG id
//*---------------------------------------------------------------------------*
void ShaderNode::SetID(const LONG& t_id)
//*---------------------------------------------------------------------------*
{
id = t_id;
}
//*---------------------------------------------------------------------------*
LONG ShaderNode::GetID()
//*---------------------------------------------------------------------------*
{
return id;
}
// Bool showPreview
//*---------------------------------------------------------------------------*
void ShaderNode::SetShowPreview(const Bool& t_showPreview)
//*---------------------------------------------------------------------------*
{
if (t_showPreview) flags |= SHADERNODE_FLAGS_SHOWPREVIEW;
else flags &= ~SHADERNODE_FLAGS_SHOWPREVIEW;
}
//*---------------------------------------------------------------------------*
Bool ShaderNode::GetShowPreview()
//*---------------------------------------------------------------------------*
{
return (flags & SHADERNODE_FLAGS_SHOWPREVIEW);
}
//*---------------------------------------------------------------------------*
void ShaderNode::InvertShowPreview()
//*---------------------------------------------------------------------------*
{
if (flags & SHADERNODE_FLAGS_SHOWPREVIEW) flags &= ~SHADERNODE_FLAGS_SHOWPREVIEW;
else flags |= SHADERNODE_FLAGS_SHOWPREVIEW;
}
// Bool selected
//*---------------------------------------------------------------------------*
void ShaderNode::SetSelected(const Bool& t_selected)
//*---------------------------------------------------------------------------*
{
if (t_selected) flags |= SHADERNODE_FLAGS_SELECTED;
else flags &= ~SHADERNODE_FLAGS_SELECTED;
}
//*---------------------------------------------------------------------------*
Bool ShaderNode::GetSelected()
//*---------------------------------------------------------------------------*
{
return (flags & SHADERNODE_FLAGS_SELECTED);
}
// Bool expanded
//*---------------------------------------------------------------------------*
void ShaderNode::SetExpanded(const Bool& t_expanded)
//*---------------------------------------------------------------------------*
{
if (t_expanded) flags |= SHADERNODE_FLAGS_EXPANDED;
else flags &= ~SHADERNODE_FLAGS_EXPANDED;
}
//*---------------------------------------------------------------------------*
Bool ShaderNode::GetExpanded()
//*---------------------------------------------------------------------------*
{
return (flags & SHADERNODE_FLAGS_EXPANDED);
}
//*---------------------------------------------------------------------------*
void ShaderNode::InvertExpanded()
//*---------------------------------------------------------------------------*
{
if (flags & SHADERNODE_FLAGS_EXPANDED) flags &= ~SHADERNODE_FLAGS_EXPANDED;
else flags |= SHADERNODE_FLAGS_EXPANDED;
}
// LONG type
//*---------------------------------------------------------------------------*
Bool ShaderNode::IsInstanceOf(const LONG& t_type)
//*---------------------------------------------------------------------------*
{
return (type == t_type);
}
//*---------------------------------------------------------------------------*
void ShaderNode::SetType(const LONG& t_type)
//*---------------------------------------------------------------------------*
{
type = t_type;
}
//*---------------------------------------------------------------------------*
LONG ShaderNode::GetType()
//*---------------------------------------------------------------------------*
{
return type;
}
// LONG numNodeInputs
//*---------------------------------------------------------------------------*
LONG ShaderNode::GetNodeCount()
//*---------------------------------------------------------------------------*
{
return numNodeInputs;
}
// LONG acceptCount
//*---------------------------------------------------------------------------*
LONG ShaderNode::GetAcceptCount()
//*---------------------------------------------------------------------------*
{
return acceptCount;
}
//*---------------------------------------------------------------------------*
void ShaderNode::ClearInputs()
//*---------------------------------------------------------------------------*
{
if (!nodeInputs) return;
for (LONG i = 0L; i != numNodeInputs; ++i)
{
nodeInputs[i].SetNode(NULL);
}
}
// LONG connections
//*---------------------------------------------------------------------------*
void ShaderNode::SetConnections(const LONG& count)
//*---------------------------------------------------------------------------*
{
connections = count;
}
//*---------------------------------------------------------------------------*
void ShaderNode::IncConnect()
//*---------------------------------------------------------------------------*
{
++connections;
}
//*---------------------------------------------------------------------------*
void ShaderNode::DecConnect()
//*---------------------------------------------------------------------------*
{
if (connections > 0L) --connections;
}
//*---------------------------------------------------------------------------*
LONG ShaderNode::Connected()
//*---------------------------------------------------------------------------*
{
return connections;
}
// Bool connecting
//*---------------------------------------------------------------------------*
void ShaderNode::SetConnecting(const Bool& t_connecting)
//*---------------------------------------------------------------------------*
{
if (t_connecting) flags |= SHADERNODE_FLAGS_CONNECTING;
else flags &= ~SHADERNODE_FLAGS_CONNECTING;
}
//*---------------------------------------------------------------------------*
Bool ShaderNode::IsConnecting()
//*---------------------------------------------------------------------------*
{
return (flags & SHADERNODE_FLAGS_CONNECTING);
}
// NodeInput* nodeInputs - retrieve by index
//*---------------------------------------------------------------------------*
NodeInput* ShaderNode::GetNodeInput(LONG index)
//*---------------------------------------------------------------------------*
{
if (!nodeInputs) return NULL;
if (!numNodeInputs) return NULL;
if (index >= numNodeInputs) return NULL;
return &nodeInputs[index];
}
// Read/Write/CopyTo
// - Read NodeInput info
//*---------------------------------------------------------------------------*
Bool ShaderNode::Read(HyperFile* hf, LONG level)
//*---------------------------------------------------------------------------*
{
if (!hf->ReadString(&name)) return FALSE;
if (!hf->ReadLong(&xPos)) return FALSE;
if (!hf->ReadLong(&yPos)) return FALSE;
if (!hf->ReadLong(&id)) return FALSE;
if (!hf->ReadLong(&flags)) return FALSE;
if (!hf->ReadLong(&type)) return FALSE;
if (!hf->ReadLong(&numNodeInputs)) return FALSE;
if (!hf->ReadLong(&acceptCount)) return FALSE;
if (!hf->ReadLong(&connections)) return FALSE;
if (!nodeInputs) return TRUE;
for (LONG i = 0L; i != numNodeInputs; ++i)
{
if (!nodeInputs[i].Read(hf, level)) return FALSE;
}
return TRUE;
}
// - Write NodeInput info
//*---------------------------------------------------------------------------*
Bool ShaderNode::Write(HyperFile* hf)
//*---------------------------------------------------------------------------*
{
if (!hf->WriteString(name)) return FALSE;
if (!hf->WriteLong(xPos)) return FALSE;
if (!hf->WriteLong(yPos)) return FALSE;
if (!hf->WriteLong(id)) return FALSE;
if (!hf->WriteLong(flags)) return FALSE;
if (!hf->WriteLong(type)) return FALSE;
if (!hf->WriteLong(numNodeInputs)) return FALSE;
if (!hf->WriteLong(acceptCount)) return FALSE;
if (!hf->WriteLong(connections)) return FALSE;
if (!nodeInputs) return TRUE;
for (LONG i = 0L; i != numNodeInputs; ++i)
{
if (!nodeInputs[i].Write(hf)) return FALSE;
}
return TRUE;
}
// - Copy Source NodeInput info to Destination NodeInput
//*---------------------------------------------------------------------------*
Bool ShaderNode::CopyTo(ShaderNode* dsn, Bool uniqueID)
//*---------------------------------------------------------------------------*
{
dsn->name = name;
dsn->xPos = xPos;
dsn->yPos = yPos;
if (!uniqueID) dsn->id = id;
dsn->flags = flags;
dsn->type = type;
dsn->numNodeInputs = numNodeInputs;
dsn->acceptCount = acceptCount;
dsn->connections = connections;
if (!nodeInputs) return TRUE;
for (LONG i = 0L; i != numNodeInputs; ++i)
{
nodeInputs[i].CopyTo(&(dsn->nodeInputs[i]), FALSE);
}
return TRUE;
}
// - Reestablish NodeInput* node links from id's
//*---------------------------------------------------------------------------*
void ShaderNode::ReestablishNodeLinks(ShaderNode* firstSNode)
//*---------------------------------------------------------------------------*
{
if (!nodeInputs) return;
ShaderNode* sn = NULL;
for (LONG i = 0L; i != numNodeInputs; ++i)
{
ni = &nodeInputs[i];
for (sn = firstSNode; sn; sn = (ShaderNode* )sn->GetNext())
{
if (sn->id == ni->GetNodeID())
{
ni->SetNode(sn);
break;
}
}
}
}
//*---------------------------------------------------------------------------*
void ShaderNode::SetPreview(BaseMaterial* chn, Bool fromFile)
//*---------------------------------------------------------------------------*
{
}
//*---------------------------------------------------------------------------*
Vector ShaderNode::Output(BaseMaterial* chn, ChannelData* cd)
//*---------------------------------------------------------------------------*
{
return Vector(1.0);
}
// BaseBitmap *previewBitmap
//*---------------------------------------------------------------------------*
BaseBitmap* ShaderNode::GetPreview()
//*---------------------------------------------------------------------------*
{
/*
if (!previewGL) return NULL;
if (!previewBitmap) return NULL;
// Create the shader node preview using OpenGL and store in 'previewBitmap'
previewGL->Draw();
// pointers for processing
UCHAR* redbuff = previewGL->GetRender();
UCHAR* greenbuff = redbuff+65536L;
UCHAR* bluebuff = greenbuff+65536L;
// 256x256 pixels
LONG x;
LONG r, g, b;
for (LONG y = 255L; y != -1L; --y)
{
for (x = 0L; x != 256L; ++x)
{
r = *redbuff++;
g = *greenbuff++;
b = *bluebuff++;
previewBitmap->SetPixel(x, y, r, g, b);
}
}
*/
return previewBitmap;
}