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