1 /* bzflag
2  * Copyright (c) 1993-2021 Tim Riker
3  *
4  * This package is free software;  you can redistribute it and/or
5  * modify it under the terms of the license found in the file
6  * named COPYING that should have accompanied this file.
7  *
8  * THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
9  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
10  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
11  */
12 
13 // interface header
14 #include "EighthDimShellNode.h"
15 
16 // system headers
17 #include <stdlib.h>
18 
19 // common headers
20 #include "SceneRenderer.h"
21 #include "OpenGLGState.h"
22 #include "BZDBCache.h"
23 
24 
EighthDimShellNode(SceneNode * node,bool _ownTheNode)25 EighthDimShellNode::EighthDimShellNode(SceneNode* node, bool _ownTheNode)
26 {
27     sceneNode = node;
28     ownTheNode = _ownTheNode;
29 
30     makeNodes();
31 
32     return;
33 }
34 
35 
~EighthDimShellNode()36 EighthDimShellNode::~EighthDimShellNode()
37 {
38     if (ownTheNode)
39         delete sceneNode;
40     killNodes();
41     return;
42 }
43 
makeNodes()44 void EighthDimShellNode::makeNodes()
45 {
46     std::vector<RenderSet> rnodes;
47     sceneNode->getRenderNodes(rnodes);
48 
49     shellNodeCount = (int)rnodes.size();
50     if (shellNodeCount <= 0)
51     {
52         shellNodeCount = 0;
53         shellNodes = NULL;
54         return;
55     }
56 
57     shellNodes = new ShellRenderNode*[shellNodeCount];
58     for (int i = 0; i < shellNodeCount; i++)
59         shellNodes[i] = new ShellRenderNode(rnodes[i].node, rnodes[i].gstate);
60 
61     return;
62 }
63 
64 
killNodes()65 void EighthDimShellNode::killNodes()
66 {
67     for (int i = 0; i < shellNodeCount; i++)
68         delete shellNodes[i];
69     delete[] shellNodes;
70     shellNodes = NULL;
71     shellNodeCount = 0;
72     return;
73 }
74 
75 
notifyStyleChange()76 void EighthDimShellNode::notifyStyleChange()
77 {
78     killNodes();
79     makeNodes();
80     return;
81 }
82 
83 
cull(const ViewFrustum &) const84 bool EighthDimShellNode::cull(const ViewFrustum&) const
85 {
86     // no culling
87     return false;
88 }
89 
90 
addRenderNodes(SceneRenderer & renderer)91 void EighthDimShellNode::addRenderNodes(SceneRenderer& renderer)
92 {
93     for (int i = 0; i < shellNodeCount; i++)
94         renderer.addRenderNode(shellNodes[i], shellNodes[i]->getGState());
95     return;
96 }
97 
98 
99 //
100 // EighthDimShellNode::ShellRenderNode
101 //
102 
ShellRenderNode(RenderNode * node,const OpenGLGState * gs)103 EighthDimShellNode::ShellRenderNode::ShellRenderNode(RenderNode *node,
104         const OpenGLGState* gs)
105 
106 {
107     renderNode = node;
108 
109     OpenGLGStateBuilder gb = *gs;
110     if (BZDBCache::blend && (RENDERER.useQuality() >= 2))
111         gb.setBlending(GL_ONE, GL_ONE);
112     else
113         gb.resetBlending();
114     gb.setCulling(GL_FRONT); // invert the culling
115     gstate = gb.getState(); // get the modified gstate
116 
117     return;
118 }
119 
120 
~ShellRenderNode()121 EighthDimShellNode::ShellRenderNode::~ShellRenderNode()
122 {
123     return;
124 }
125 
126 
getGState() const127 const OpenGLGState* EighthDimShellNode::ShellRenderNode::getGState() const
128 {
129     return &gstate;
130 }
131 
132 
render()133 void EighthDimShellNode::ShellRenderNode::render()
134 {
135 //  glLogicOp(GL_XOR);
136 //  glEnable(GL_COLOR_LOGIC_OP);
137 //  glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_FALSE);
138 
139     if (BZDBCache::blend && RENDERER.useQuality() >= 2)
140         renderNode->render();
141 
142     glPolygonMode(GL_BACK, GL_LINE);
143     glLineWidth(3.0f);
144 
145     renderNode->render();
146 
147     glLineWidth(1.0f);
148     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
149 
150 //  glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
151 //  glDisable(GL_COLOR_LOGIC_OP);
152 
153     return;
154 }
155 
156 
157 // Local Variables: ***
158 // mode: C++ ***
159 // tab-width: 4 ***
160 // c-basic-offset: 4 ***
161 // indent-tabs-mode: nil ***
162 // End: ***
163 // ex: shiftwidth=4 tabstop=4
164