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 #include "PyramidSceneNodeGenerator.h"
14 #include "PyramidBuilding.h"
15 #include "bzfgl.h"
16 #include "TriWallSceneNode.h"
17 #include "QuadWallSceneNode.h"
18
19 //
20 // PyramidSceneNodeGenerator
21 //
22
PyramidSceneNodeGenerator(const PyramidBuilding * _pyramid)23 PyramidSceneNodeGenerator::PyramidSceneNodeGenerator(
24 const PyramidBuilding* _pyramid) :
25 pyramid(_pyramid)
26 {
27 // do nothing
28 }
29
~PyramidSceneNodeGenerator()30 PyramidSceneNodeGenerator::~PyramidSceneNodeGenerator()
31 {
32 // do nothing
33 }
34
getNextNode(float uRepeats,float vRepeats,bool lod)35 WallSceneNode* PyramidSceneNodeGenerator::getNextNode(
36 float uRepeats, float vRepeats, bool lod)
37 {
38
39 bool isQuad = false;
40
41 if (getNodeNumber() == 5) return NULL;
42
43 GLfloat base[3], sCorner[3], tCorner[3];
44 if (pyramid->getZFlip())
45 {
46 switch (incNodeNumber())
47 {
48 case 1:
49 pyramid->getCorner(4, base);
50 pyramid->getCorner(1, sCorner);
51 pyramid->getCorner(0, tCorner);
52 isQuad = false;
53 break;
54 case 2:
55 pyramid->getCorner(4, base);
56 pyramid->getCorner(2, sCorner);
57 pyramid->getCorner(1, tCorner);
58 isQuad = false;
59 break;
60 case 3:
61 pyramid->getCorner(4, base);
62 pyramid->getCorner(3, sCorner);
63 pyramid->getCorner(2, tCorner);
64 isQuad = false;
65 break;
66 case 4:
67 pyramid->getCorner(4, base);
68 pyramid->getCorner(0, sCorner);
69 pyramid->getCorner(3, tCorner);
70 isQuad = false;
71 break;
72 case 5:
73 pyramid->getCorner(0, base);
74 pyramid->getCorner(1, sCorner);
75 pyramid->getCorner(3, tCorner);
76 isQuad = true;
77 break;
78 }
79 }
80 else
81 {
82 switch (incNodeNumber())
83 {
84 case 1:
85 pyramid->getCorner(0, base);
86 pyramid->getCorner(1, sCorner);
87 pyramid->getCorner(4, tCorner);
88 isQuad = false;
89 break;
90 case 2:
91 pyramid->getCorner(1, base);
92 pyramid->getCorner(2, sCorner);
93 pyramid->getCorner(4, tCorner);
94 isQuad = false;
95 break;
96 case 3:
97 pyramid->getCorner(2, base);
98 pyramid->getCorner(3, sCorner);
99 pyramid->getCorner(4, tCorner);
100 isQuad = false;
101 break;
102 case 4:
103 pyramid->getCorner(3, base);
104 pyramid->getCorner(0, sCorner);
105 pyramid->getCorner(4, tCorner);
106 isQuad = false;
107 break;
108 case 5:
109 if ((pyramid->getPosition()[2] > 0.0f) || pyramid->getZFlip())
110 {
111 pyramid->getCorner(0, base);
112 pyramid->getCorner(3, sCorner);
113 pyramid->getCorner(1, tCorner);
114 isQuad = true;
115 }
116 else
117 return NULL;
118 break;
119 }
120 }
121
122 GLfloat sEdge[3];
123 GLfloat tEdge[3];
124 sEdge[0] = sCorner[0] - base[0];
125 sEdge[1] = sCorner[1] - base[1];
126 sEdge[2] = sCorner[2] - base[2];
127 tEdge[0] = tCorner[0] - base[0];
128 tEdge[1] = tCorner[1] - base[1];
129 tEdge[2] = tCorner[2] - base[2];
130
131 if (isQuad == false)
132 return new TriWallSceneNode(base, sEdge, tEdge, uRepeats, vRepeats, lod);
133 else
134 return new QuadWallSceneNode(base, sEdge, tEdge, uRepeats, vRepeats, lod);
135
136 }
137
138 // Local Variables: ***
139 // mode: C++ ***
140 // tab-width: 4 ***
141 // c-basic-offset: 4 ***
142 // indent-tabs-mode: nil ***
143 // End: ***
144 // ex: shiftwidth=4 tabstop=4
145