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