KiCad PCB EDA Suite
sg_colors.cpp
Go to the documentation of this file.
1 /*
2  * This program source code file is part of KiCad, a free EDA CAD application.
3  *
4  * Copyright (C) 2015-2017 Cirilo Bernardo <[email protected]>
5  * Copyright (C) 2020 KiCad Developers, see AUTHORS.txt for contributors.
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, you may find one here:
19  * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
20  * or you may search the http://www.gnu.org website for the version 2 license,
21  * or you may write to the Free Software Foundation, Inc.,
22  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
23  */
24 
25 #include <iostream>
26 #include <sstream>
27 #include <wx/log.h>
28 
29 #include "3d_cache/sg/sg_colors.h"
30 #include "3d_cache/sg/sg_helpers.h"
31 
32 
33 SGCOLORS::SGCOLORS( SGNODE* aParent ) : SGNODE( aParent )
34 {
36 
37  if( nullptr != aParent && S3D::SGTYPE_FACESET != aParent->GetNodeType() )
38  {
39  m_Parent = nullptr;
40 
41  wxLogTrace( MASK_3D_SG,
42  wxT( "%s:%s:%d * [BUG] inappropriate parent to SGCOLORS (type %s)" ),
43  __FILE__, __FUNCTION__, __LINE__, aParent->GetNodeType() );
44  }
45  else if( nullptr != aParent && S3D::SGTYPE_FACESET == aParent->GetNodeType() )
46  {
47  m_Parent->AddChildNode( this );
48  }
49 }
50 
51 
53 {
54  colors.clear();
55 }
56 
57 
58 bool SGCOLORS::SetParent( SGNODE* aParent, bool notify )
59 {
60  if( nullptr != m_Parent )
61  {
62  if( aParent == m_Parent )
63  return true;
64 
65  // handle the change in parents
66  if( notify )
67  m_Parent->unlinkChildNode( this );
68 
69  m_Parent = nullptr;
70 
71  if( nullptr == aParent )
72  return true;
73  }
74 
75  // only a SGFACESET may be parent to a SGCOLORS
76  if( nullptr != aParent && S3D::SGTYPE_FACESET != aParent->GetNodeType() )
77  return false;
78 
79  m_Parent = aParent;
80 
81  if( m_Parent )
82  m_Parent->AddChildNode( this );
83 
84  return true;
85 }
86 
87 
88 SGNODE* SGCOLORS::FindNode(const char* aNodeName, const SGNODE *aCaller) noexcept
89 {
90  if( nullptr == aNodeName || 0 == aNodeName[0] )
91  return nullptr;
92 
93  if( !m_Name.compare( aNodeName ) )
94  return this;
95 
96  return nullptr;
97 }
98 
99 
100 void SGCOLORS::unlinkChildNode( const SGNODE* aCaller ) noexcept
101 {
102  wxCHECK( aCaller, /* void */ );
103 }
104 
105 
106 void SGCOLORS::unlinkRefNode( const SGNODE* aCaller ) noexcept
107 {
108  wxCHECK( aCaller, /* void */ );
109 }
110 
111 
112 bool SGCOLORS::AddRefNode( SGNODE* aNode ) noexcept
113 {
114  wxCHECK( aNode, false );
115 
116  return false;
117 }
118 
119 
120 bool SGCOLORS::AddChildNode( SGNODE* aNode ) noexcept
121 {
122  wxCHECK( aNode, false );
123 
124  return false;
125 }
126 
127 
128 bool SGCOLORS::GetColorList( size_t& aListSize, SGCOLOR*& aColorList )
129 {
130  if( colors.empty() )
131  {
132  aListSize = 0;
133  aColorList = nullptr;
134  return false;
135  }
136 
137  aListSize = colors.size();
138  aColorList = &colors[0];
139  return true;
140 }
141 
142 
143 void SGCOLORS::SetColorList( size_t aListSize, const SGCOLOR* aColorList )
144 {
145  colors.clear();
146 
147  if( 0 == aListSize || nullptr == aColorList )
148  return;
149 
150  for( size_t i = 0; i < aListSize; ++i )
151  colors.push_back( aColorList[i] );
152 
153  return;
154 }
155 
156 
157 void SGCOLORS::AddColor( double aRedValue, double aGreenValue, double aBlueValue )
158 {
159  colors.emplace_back( aRedValue, aGreenValue, aBlueValue );
160  return;
161 }
162 
163 
164 void SGCOLORS::AddColor( const SGCOLOR& aColor )
165 {
166  colors.push_back( aColor );
167  return;
168 }
169 
170 
172 {
173  m_written = false;
174 
175  // rename this node
176  m_Name.clear();
177  GetName();
178 }
179 
180 
181 bool SGCOLORS::WriteVRML( std::ostream& aFile, bool aReuseFlag )
182 {
183  if( colors.empty() )
184  return false;
185 
186  if( aReuseFlag )
187  {
188  if( !m_written )
189  {
190  aFile << "color DEF " << GetName() << " Color { color [\n ";
191  m_written = true;
192  }
193  else
194  {
195  aFile << "color USE " << GetName() << "\n";
196  return true;
197  }
198  }
199  else
200  {
201  aFile << "color Color { color [\n ";
202  }
203 
204  std::string tmp;
205  size_t n = colors.size();
206  bool nline = false;
207 
208  for( size_t i = 0; i < n; )
209  {
210  S3D::FormatColor( tmp, colors[i] );
211  float r,g,b;
212  colors[i].GetColor(r, g, b);
213  aFile << tmp ;
214  ++i;
215 
216  if( i < n )
217  {
218  aFile << ",";
219 
220  if( nline )
221  {
222  aFile << "\n ";
223  nline = false;
224  }
225  else
226  {
227  nline = true;
228  }
229 
230  }
231  }
232 
233  aFile << "] }\n";
234 
235  return true;
236 }
237 
238 
239 bool SGCOLORS::WriteCache( std::ostream& aFile, SGNODE* parentNode )
240 {
241  if( nullptr == parentNode )
242  {
243  wxCHECK( m_Parent, false );
244 
245  SGNODE* np = m_Parent;
246 
247  while( nullptr != np->GetParent() )
248  np = np->GetParent();
249 
250  if( np->WriteCache( aFile, nullptr ) )
251  {
252  m_written = true;
253  return true;
254  }
255 
256  return false;
257  }
258 
259  wxCHECK( parentNode == m_Parent, false );
260 
261  if( !aFile.good() )
262  {
263  wxLogTrace( MASK_3D_SG, wxT( "%s:%s:%d * [INFO] bad stream" ),
264  __FILE__, __FUNCTION__, __LINE__ );
265 
266  return false;
267  }
268 
269  aFile << "[" << GetName() << "]";
270  size_t ncolors = colors.size();
271  aFile.write( (char*)&ncolors, sizeof(size_t) );
272 
273  for( size_t i = 0; i < ncolors; ++i )
274  S3D::WriteColor( aFile, colors[i] );
275 
276  if( aFile.fail() )
277  return false;
278 
279  m_written = true;
280  return true;
281 }
282 
283 
284 bool SGCOLORS::ReadCache( std::istream& aFile, SGNODE* parentNode )
285 {
286  wxCHECK( colors.empty(), false );
287 
288  size_t ncolors;
289  aFile.read( (char*) &ncolors, sizeof( size_t ) );
290  SGCOLOR tmp;
291 
292  if( aFile.fail() )
293  return false;
294 
295  for( size_t i = 0; i < ncolors; ++i )
296  {
297  if( !S3D::ReadColor( aFile, tmp ) || aFile.fail() )
298  return false;
299 
300  colors.push_back( tmp );
301  }
302 
303  return true;
304 }
virtual bool SetParent(SGNODE *aParent, bool notify=true) override
Set the parent SGNODE of this object.
Definition: sg_colors.cpp:58
void AddColor(double aRedValue, double aGreenValue, double aBlueValue)
Definition: sg_colors.cpp:157
bool AddRefNode(SGNODE *aNode) noexcept override
Definition: sg_colors.cpp:112
SGNODE * m_Parent
Pointer to parent node; may be NULL for top level transform.
Definition: sg_node.h:227
bool ReadColor(std::istream &aFile, SGCOLOR &aColor)
Definition: sg_helpers.cpp:295
bool GetColorList(size_t &aListSize, SGCOLOR *&aColorList)
Definition: sg_colors.cpp:128
void FormatColor(std::string &result, const SGCOLOR &aColor)
Definition: sg_helpers.cpp:135
bool ReadCache(std::istream &aFile, SGNODE *parentNode) override
Reads binary format data from a cache file.
Definition: sg_colors.cpp:284
bool WriteColor(std::ostream &aFile, const SGCOLOR &aColor)
Definition: sg_helpers.cpp:180
The base class of all Scene Graph nodes.
Definition: sg_node.h:74
void ReNameNodes(void) override
Rename a node and all its child nodes in preparation for write operations.
Definition: sg_colors.cpp:171
const char * GetName(void)
Definition: sg_node.cpp:146
bool m_written
Set to true when the object has been written after a ReNameNodes().
Definition: sg_node.h:230
void unlinkChildNode(const SGNODE *aNode) noexcept override
Remove references to an owned child.
Definition: sg_colors.cpp:100
virtual void unlinkChildNode(const SGNODE *aNode)=0
Remove references to an owned child.
bool WriteVRML(std::ostream &aFile, bool aReuseFlag) override
Writes this node's data to a VRML file.
Definition: sg_colors.cpp:181
std::vector< SGCOLOR > colors
Definition: sg_colors.h:64
void unlinkRefNode(const SGNODE *aNode) noexcept override
Remove pointers to a referenced node.
Definition: sg_colors.cpp:106
virtual ~SGCOLORS()
Definition: sg_colors.cpp:52
E_SERIE r
Definition: eserie.cpp:41
SGNODE * GetParent(void) const noexcept
Returns a pointer to the parent SGNODE of this object or NULL if the object has no parent (ie.
Definition: sg_node.cpp:110
std::string m_Name
name to use for referencing the entity by name.
Definition: sg_node.h:229
virtual bool WriteCache(std::ostream &aFile, SGNODE *parentNode)=0
Write this node's data to a binary cache file.
SGNODE * FindNode(const char *aNodeName, const SGNODE *aCaller) noexcept override
Search the tree of linked nodes and return a reference to the first node found with the given name.
Definition: sg_colors.cpp:88
S3D::SGTYPES m_SGtype
Type of Scene Graph node.
Definition: sg_node.h:228
bool WriteCache(std::ostream &aFile, SGNODE *parentNode) override
Write this node's data to a binary cache file.
Definition: sg_colors.cpp:239
void SetColorList(size_t aListSize, const SGCOLOR *aColorList)
Definition: sg_colors.cpp:143
virtual bool AddChildNode(SGNODE *aNode)=0
Define a number of macros to aid in repetitious code which is probably best expressed as a preprocess...
bool AddChildNode(SGNODE *aNode) noexcept override
Definition: sg_colors.cpp:120
SGCOLORS(SGNODE *aParent)
Definition: sg_colors.cpp:33
S3D::SGTYPES GetNodeType(void) const noexcept
Return the type of this node instance.
Definition: sg_node.cpp:104