#ifndef GUINodeContainer_h__ #define GUINodeContainer_h__ #include #include #include #include "GUIShaderNode.h" #include "GUIShaderNodeTexture.h" #include #include #include #include struct LinkInfo { GUIShaderNodeIO* left; GUIShaderNodeIO* right; }; #define SPLINE_FREQ 20 typedef std::vector NodeCollection; typedef std::vector::iterator NodeCollectionItr; class GUINodeContainer : public GUIWindow, public ISerializable { public: EVENT2(GUINodeContainer_NodeEvent, GUINodeContainer*, GUIShaderNode*); GUINodeContainer_NodeEvent Event_DeleteNode; GUINodeContainer(IShaderGraph* graph); ~GUINodeContainer(); bool Serialize(Core::IMemoryStream* stm); bool Deserialize(Core::IMemoryStream* stm); //void AddChild(GUIWindow* val); void MakeLink(GUIShaderNodeIO* left, GUIShaderNodeIO* right); void BreakLink(GUIShaderNodeIO* left, GUIShaderNodeIO* right); void SetBackColor(const Vec4f& color); void RenderSelf(); GUIShaderNode* FindNode(int id); GUIShaderNode* AddNode(const String& name); void Invalidate() { GUIWindow::Invalidate(); invalid = true; } GUIShaderNode* GetMaterialNode() { return materialNode; } NodeCollection* GetTextureUnits(); void RebuildGraph(); size_t GetNodeCount() { return nodes.size(); } GUIShaderNode* getNode(int id) { return nodes[id]; } String GetTexNameByID(int id); private: void OnNodeSelect(GUIShaderNode* node); void GenGeom(); void OnNodeLayoutUpdate(); void SetSelection(GUIShaderNode* node); void DeleteNode(GUIShaderNode* node); void OnNodeHeaderMouseClick(GUIWindow* wnd, int param); void OnNodePortMouseClick(GUIWindow* wnd, int param); void OnDeleteLink(GUIMenuItem* itm); void OnDeleteNode(GUIMenuItem* itm); void RegisterNewNode(GUIShaderNode* node); GUIShaderNode* FindNodeByGraphicsID(int id); GUIShaderNode* selection; GUIShaderNodeIO* selected_port; GUIMenu* menu; NodeCollection nodes; NodeCollection texNodes; GUIShaderNode* materialNode; bool invalid; IShaderGraph* graphics_graph; typedef std::vector LinksCollection; typedef std::vector::iterator LinksCollectionItr; LinksCollection links; int cache_length; GUIVertex cache[SPLINE_FREQ * 2]; GUIVertex cache2[SPLINE_FREQ * 2 * 128]; //128 splines cache }; #endif // GUINodeContainer_h__