CFx SDK Documentation 2026 SP0
Loading...
Searching...
No Matches
GsOverlayDefs.h
Go to the documentation of this file.
1
2// Copyright (C) 2002-2024, Open Design Alliance (the "Alliance").
3// All rights reserved.
4//
5// This software and its documentation and related materials are owned by
6// the Alliance. The software may only be incorporated into application
7// programs owned by members of the Alliance, subject to a signed
8// Membership Agreement and Supplemental Software License Agreement with the
9// Alliance. The structure and organization of this software are the valuable
10// trade secrets of the Alliance and its suppliers. The software is also
11// protected by copyright law and international treaty provisions. Application
12// programs incorporating this software must include the following statement
13// with their copyright notices:
14//
15// This application incorporates Open Design Alliance software pursuant to a license
16// agreement with Open Design Alliance.
17// Open Design Alliance Copyright (C) 2002-2024 by Open Design Alliance.
18// All rights reserved.
19//
20// By use of this software, its documentation or related materials, you
21// acknowledge and accept the above terms.
23
24#ifndef __GSOVERLAYDEFS_H_INCLUDED_
25#define __GSOVERLAYDEFS_H_INCLUDED_
26
27#include "OdArray.h"
28
29#include "TD_PackPush.h"
30
42{
43 kGsMainOverlay = 0, // "Main" scene overlay
44 kGsDirectOverlay, // "Direct" overlay
45 kGsUserFg3Overlay, // "User Foreground 3" overlay
46 kGsUserBg1Overlay, // "User Background 1" overlay
47 kGsUserBg3Overlay, // "User Background 3" overlay
48 kGsUserFg1Overlay, // "User Foreground 1" overlay
49 kGsHighlightOverlay, // "Highlight" overlay
50 kGsHighlightSelectionOverlay, // "Highlight Selection" overlay
51 kGsDirectTopmostOverlay, // "Direct Topmost" overlay
52 kGsSpriteOverlay, // "Sprite" overlay
53 kGsContrastOverlay, // "Contrast" overlay
54 kGsUserFg2Overlay, // "User Foreground 2" overlay
55 kGsUserBg2Overlay, // "User Background 2" overlay
56 kNumGsOverlays, // Number of Gs overlays
57 kGsAllOverlays = 0x1FFF, // Mask for all overlays
58 kGsNoOverlays = 0, // Mask for no overlays
59 kGsUndefinedOverlay = -1 // Special code for undefined overlay
60};
61
68{
69 protected:
70 //DOM-IGNORE-BEGIN
71
79 inline static OdInt32 numOverlays1() { return OdInt32(kNumOverlays); }
80 inline static OdInt32 numOverlays2() { return OdInt32(kNumGsOverlays); }
81
82 //DOM-IGNORE-END
83 public:
88 {
89 kMainDepth = 0, // Use main depth buffer
90 kNoDepth = 1, // Don't use depth buffer
91 kOwnDepth = 2, // Use own (alternative) depth buffer
92 kNoFrameBuf = 4, // Use direct rendering without frame buffer
93 kHltStyle = 8, // Draw with highlighting style
94 kContrastStyle = 16 // Draw with contast style
95 };
96
101 {
102 switch (id)
103 {
104 case kGsUserBg1Overlay: return kNoDepth;
105 case kGsUserBg2Overlay: return kOwnDepth;
106 case kGsUserBg3Overlay: return kMainDepth;
107 case kGsMainOverlay: return kMainDepth;
108 case kGsSpriteOverlay: return kOwnDepth;
109 case kGsDirectOverlay: return kNoDepth;
114 case kGsUserFg1Overlay: return kMainDepth;
115 case kGsUserFg2Overlay: return kOwnDepth;
116 case kGsUserFg3Overlay: return kNoDepth;
117 default: ODA_FAIL();
118 }
119 return kNoDepth;
120 }
121 public:
127 {
128 switch (id)
129 {
130 case kGsMainOverlay: return kMain;
131 case kGsDirectOverlay: return kDirect;
132 case kGsUserFg3Overlay: return kUserFg3;
133 case kGsUserBg1Overlay: return kUserBg1;
134 case kGsUserBg3Overlay: return kUserBg3;
135 case kGsUserFg1Overlay: return kUserFg1;
136 case kGsHighlightOverlay: return kHighlight;
139 case kGsSpriteOverlay: return kSprite;
140 case kGsContrastOverlay: return kContrast;
141 case kGsUserFg2Overlay: return kUserFg2;
142 case kGsUserBg2Overlay: return kUserBg2;
143 default: ODA_FAIL();
144 }
145 return kMain;
146 }
147
152 {
153 switch (renderOrder)
154 {
155 case kUserBg1: return kGsUserBg1Overlay;
156 case kUserBg2: return kGsUserBg2Overlay;
157 case kUserBg3: return kGsUserBg3Overlay;
158 case kMain: return kGsMainOverlay;
159 case kSprite: return kGsSpriteOverlay;
160 case kDirect: return kGsDirectOverlay;
161 case kHighlight: return kGsHighlightOverlay;
164 case kContrast: return kGsContrastOverlay;
165 case kUserFg1: return kGsUserFg1Overlay;
166 case kUserFg2: return kGsUserFg2Overlay;
167 case kUserFg3: return kGsUserFg3Overlay;
168 default: ODA_FAIL();
169 }
170 return kGsMainOverlay;
171 }
172
177 inline static bool validateDefinitions(OdUInt32 gsModelDef)
178 {
179 static const bool bSameEnums = (numOverlays1() == numOverlays2()); // #VIS-2490
180 return (gsModelDef == kNumOverlays) && bSameEnums;
181 }
182
186 inline static bool validateOverlayIndex(OdGsOverlayId id)
187 {
188 return (id >= kGsMainOverlay) && (id < kNumGsOverlays);
189 }
190
194 inline static bool validateRenderingOrder(OdUInt32 renderOrder)
195 { // #CORE-12139 : expression is always true
196 return /* (renderOrder >= kUserBg1) && */ (renderOrder < kNumOverlays);
197 }
198};
199
218
224template <typename OverlayDataType = OdGsOverlayDataPlaceholder>
226{
227 public: // public allocator
232 {
236 virtual OverlayDataType *createData() { return new OverlayDataType(); }
237
241 virtual void deleteData(OverlayDataType *pObj) { delete pObj; }
242 };
243 protected: // data structures and members
244 //DOM-IGNORE-BEGIN
245
247 {
248 OverlayDataType* m_data;
251 };
258 protected: // implementations
259 void subAllocator(Allocator *pAllocator)
260 {
261 if ((pAllocator != m_pAllocator) && (pAllocator != NULL))
262 { // Apply recreation of OverlayData nodes
263 const OdUInt32 nOverlays = m_overlaysData.size();
264 OverlayData *pOverlays = m_overlaysData.asArrayPtr();
265 for (OdUInt32 nOverlay = 0; nOverlay < nOverlays; nOverlay++)
266 {
267 if (pOverlays[nOverlay].m_data)
268 {
269 OverlayDataType *pNewData = pAllocator->createData();
270 *pNewData = *pOverlays[nOverlay].m_data;
271 m_pAllocator->deleteData(pOverlays[nOverlay].m_data);
272 pOverlays[nOverlay].m_data = pNewData;
273 }
274 }
275 m_pAllocator = pAllocator;
276 }
277 }
278 void activate(OdGsOverlayId id) const
279 {
280 if (m_overlaysData.size() <= (unsigned)id)
281 m_overlaysData.resize(id + 1);
282 OverlayData &overlay = m_overlaysData.at(id);
283 if (!overlay.m_numOverlayRefs)
284 overlay.m_data = m_pAllocator->createData();
285 overlay.m_numOverlayRefs++;
286 SETBIT_1(m_uActiveOverlays, 1 << id);
287 }
289 {
290 if (m_overlaysData.size() > (unsigned)id)
291 {
292 OverlayData &overlay = m_overlaysData.at(id);
293 if (overlay.m_numOverlayRefs)
294 {
295 overlay.m_numOverlayRefs--;
296 if (!overlay.m_numOverlayRefs)
297 {
298 m_pAllocator->deleteData(overlay.m_data);
299 overlay.m_data = NULL;
300 SETBIT_0(m_uActiveOverlays, 1 << id);
302 }
303 }
304 }
305 }
306
307 //DOM-IGNORE-END
308 public:
313 : m_overlaysData(1, 1)
316 { // Always keep main overlay activated
319 }
320
325 {
326 const OdUInt32 nOverlays = m_overlaysData.size();
327 OverlayData *pOverlays = m_overlaysData.asArrayPtr();
328 for (OdUInt32 nOverlay = 0; nOverlay < nOverlays; nOverlay++)
329 {
330 if (pOverlays[nOverlay].m_data)
331 m_pAllocator->deleteData(pOverlays[nOverlay].m_data);
332 }
333 }
334
341 {
342 subAllocator(pAllocator);
343 }
344
349 {
351 }
352
361 {
362 const bool bActive = isOverlayActive(id);
363 activate(id);
364 return bActive != isOverlayActive(id);
365 }
366
375 {
376 const bool bActive = isOverlayActive(id);
377 deactivate(id);
378 return bActive != isOverlayActive(id);
379 }
380
389 {
390 if( m_overlaysData.size() > (unsigned)id )
391 {
392 OverlayData& overlay = m_overlaysData.at( id );
393 return overlay.m_numOverlayRefs;
394 }
395 return 0;
396 }
397
402
410 bool isOverlayActive(OdGsOverlayId id) const { return GETBIT(m_uActiveOverlays, 1 << id); }
411
417 bool isMultipleOverlays() const { return (m_uActiveOverlays & ~1) != 0; }
418
425 OverlayDataType *getOverlayData(OdGsOverlayId id, bool bActivate = false)
426 {
427 if (!isOverlayActive(id))
428 {
429 if (bActivate)
430 activate(id);
431 else
432 return NULL;
433 }
434 return m_overlaysData[id].m_data;
435 }
436
443 const OverlayDataType *getOverlayData(OdGsOverlayId id, bool bActivate = false) const
444 {
445 if (!isOverlayActive(id))
446 {
447 if (bActivate)
448 activate(id);
449 else
450 return NULL;
451 }
452 return m_overlaysData[id].m_data;
453 }
454
455 struct ForEach
456 {
457 virtual bool call(OdGsOverlayId overlayId, OverlayDataType *pData) = 0;
458 };
459 bool execForEach(ForEach &impl, OdUInt32 nMask = kGsAllOverlays) const
460 {
461 OdUInt32 bitSet = m_uActiveOverlays & nMask, nOlay = 0;
462 while (bitSet)
463 {
464 if (GETBIT(bitSet, 1 << nOlay))
465 {
466 if (!impl.call((OdGsOverlayId)nOlay, m_overlaysData[nOlay].m_data))
467 return false;
468 SETBIT_0(bitSet, 1 << nOlay);
469 }
470 nOlay++;
471 }
472 return true;
473 }
474
479 {
480 protected:
483 friend class OdGsOverlayDataContainer<OverlayDataType>;
484 Iterator(OverlayDataArray &_overlaysData, OdUInt32 _bitSet)
485 : overlaysData(_overlaysData), bitSet(_bitSet), nOlay(0)
486 { init(); }
487 void init()
488 {
489 if (bitSet)
490 {
491 while (!GETBIT(bitSet, 1 << nOlay))
492 nOlay++;
493 }
494 }
495 public:
501 bool next()
502 {
503 SETBIT_0(bitSet, 1 << nOlay);
504 if (bitSet)
505 {
506 do { nOlay++; } while (!GETBIT(bitSet, 1 << nOlay));
507 return true;
508 }
509 return false;
510 }
511
517 bool done() const { return !bitSet; }
518
525
529 const OverlayDataType *overlayData() const { return overlaysData.getPtr()[nOlay].m_data; }
530
534 OverlayDataType *overlayData() { return overlaysData[nOlay].m_data; }
535 };
536
542 {
544 }
545
550
556 bool isOverlayInvalid(OdGsOverlayId id) const { return GETBIT(m_uInvalidOverlays, 1 << id); }
557
564 void setOverlayInvalid(OdGsOverlayId id, bool bSet = true) { SETBIT(m_uInvalidOverlays, 1 << id, bSet); }
565
572
579 void setOverlaysInvalid(OdUInt32 nOverlays, bool bSet = true) { SETBIT(m_uInvalidOverlays, nOverlays & m_uActiveOverlays, bSet); }
580
588
596};
597
598#include "TD_PackPop.h"
599
600#endif // __GSOVERLAYDEFS_H_INCLUDED_
#define ODA_FAIL()
Definition DebugStuff.h:88
OdGsOverlayId
@ kGsUserFg1Overlay
@ kGsUserBg3Overlay
@ kGsMainOverlay
@ kGsUserBg1Overlay
@ kGsUserBg2Overlay
@ kGsDirectTopmostOverlay
@ kGsHighlightSelectionOverlay
@ kGsUndefinedOverlay
@ kGsUserFg3Overlay
@ kGsDirectOverlay
@ kGsNoOverlays
@ kGsContrastOverlay
@ kNumGsOverlays
@ kGsHighlightOverlay
@ kGsSpriteOverlay
@ kGsUserFg2Overlay
@ kGsAllOverlays
unsigned int OdUInt32
int OdInt32
#define SETBIT(flags, bit, value)
Definition OdaDefs.h:516
#define SETBIT_0(flags, bit)
Definition OdaDefs.h:519
#define GETBIT(flags, bit)
Definition OdaDefs.h:517
#define SETBIT_1(flags, bit)
Definition OdaDefs.h:520
const OverlayDataType * overlayData() const
Iterator(OverlayDataArray &_overlaysData, OdUInt32 _bitSet)
bool deactivateOverlay(OdGsOverlayId id)
bool isMultipleOverlays() const
bool isOverlayActive(OdGsOverlayId id) const
bool isAnyOverlayInvalid() const
OverlayDataArray m_overlaysData
bool isAllOverlaysIvalid() const
void setOverlaysInvalid(OdUInt32 nOverlays, bool bSet=true)
void substituteAllocator(Allocator *pAllocator)
OverlayDataType * getOverlayData(OdGsOverlayId id, bool bActivate=false)
void setOverlaysInvalid(bool bSet=true)
bool activateOverlay(OdGsOverlayId id)
void subAllocator(Allocator *pAllocator)
void activate(OdGsOverlayId id) const
OdArray< OverlayData > OverlayDataArray
OdUInt32 activeOverlays() const
void setOverlayInvalid(OdGsOverlayId id, bool bSet=true)
OdUInt32 invalidOverlays() const
void deactivate(OdGsOverlayId id)
Iterator newIterator(OdUInt32 nMask=kGsAllOverlays) const
bool execForEach(ForEach &impl, OdUInt32 nMask=kGsAllOverlays) const
const OverlayDataType * getOverlayData(OdGsOverlayId id, bool bActivate=false) const
bool isOverlayInvalid(OdGsOverlayId id) const
OdUInt32 overlayNumRefs(OdGsOverlayId id) const
virtual OverlayDataType * createData()
virtual void deleteData(OverlayDataType *pObj)
virtual bool call(OdGsOverlayId overlayId, OverlayDataType *pData)=0
static OdUInt32 overlayFlags(OdGsOverlayId id)
static bool validateOverlayIndex(OdGsOverlayId id)
static bool validateDefinitions(OdUInt32 gsModelDef)
static OdInt32 numOverlays2()
static OdInt32 numOverlays1()
static OdUInt32 overlayIndexToRenderingOrder(OdGsOverlayId id)
static bool validateRenderingOrder(OdUInt32 renderOrder)
static OdGsOverlayId overlayRenderingOrderToIndex(OdUInt32 renderOrder)