the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
1#include "stdafx.h"
2#include "ViewportCuller.h"
3#include "..\Minecraft.World\Mth.h"
4
5ViewportCuller::Face::Face(double x, double y, double z, float yRot, float xRot)
6{
7 this->xc = x;
8 this->yc = y;
9 this->zc = z;
10
11 xd = Mth::sin(yRot / 180 * PI) * Mth::cos(xRot / 180 * PI);
12 zd = -Mth::cos(yRot / 180 * PI) * Mth::cos(xRot / 180 * PI);
13 yd = -Mth::sin(xRot / 180 * PI);
14
15 cullOffs = xc*xd+yc*yd+zc*zd;
16}
17
18bool ViewportCuller::Face::inFront(double x, double y, double z, double r)
19{
20 return x*xd+y*yd+z*zd>cullOffs-r;
21}
22
23bool ViewportCuller::Face::inFront(double x0, double y0, double z0, double x1, double y1, double z1)
24{
25 if (
26 x0*xd+y0*yd+z0*zd>cullOffs ||
27 x1*xd+y0*yd+z0*zd>cullOffs ||
28 x0*xd+y1*yd+z0*zd>cullOffs ||
29 x1*xd+y1*yd+z0*zd>cullOffs ||
30 x0*xd+y0*yd+z1*zd>cullOffs ||
31 x1*xd+y0*yd+z1*zd>cullOffs ||
32 x0*xd+y1*yd+z1*zd>cullOffs ||
33 x1*xd+y1*yd+z1*zd>cullOffs
34 ) return true;
35 return false;
36}
37
38bool ViewportCuller::Face::fullyInFront(double x0, double y0, double z0, double x1, double y1, double z1)
39{
40 if ( x0*xd+y0*yd+z0*zd<cullOffs ||
41 x1*xd+y0*yd+z0*zd<cullOffs ||
42 x0*xd+y1*yd+z0*zd<cullOffs ||
43 x1*xd+y1*yd+z0*zd<cullOffs ||
44 x0*xd+y0*yd+z1*zd<cullOffs ||
45 x1*xd+y0*yd+z1*zd<cullOffs ||
46 x0*xd+y1*yd+z1*zd<cullOffs ||
47 x1*xd+y1*yd+z1*zd<cullOffs
48 ) return false;
49 return true;
50}
51
52ViewportCuller::ViewportCuller(shared_ptr<LivingEntity> mob, double fogDistance, float a)
53{
54 float yRot = mob->yRotO+(mob->yRot-mob->yRotO)*a;
55 float xRot = mob->xRotO+(mob->xRot-mob->xRotO)*a;
56
57 double x = mob->xOld+(mob->x-mob->xOld)*a;
58 double y = mob->yOld+(mob->y-mob->yOld)*a;
59 double z = mob->zOld+(mob->z-mob->zOld)*a;
60
61 double xd = Mth::sin(yRot / 180 * PI) * Mth::cos(xRot / 180 * PI);
62 double zd = -Mth::cos(yRot / 180 * PI) * Mth::cos(xRot / 180 * PI);
63 double yd = -Mth::sin(xRot / 180 * PI);
64
65 float xFov = 30;
66 float yFov = 45;
67 faces[0] = Face(x, y, z, yRot, xRot);
68 faces[1] = Face(x, y, z, yRot+xFov, xRot);
69 faces[2] = Face(x, y, z, yRot-xFov, xRot);
70 faces[3] = Face(x, y, z, yRot, xRot+yFov);
71 faces[4] = Face(x, y, z, yRot, xRot-yFov);
72 faces[5] = Face(x+xd*fogDistance, y+yd*fogDistance, z+zd*fogDistance, yRot+180, -xRot);
73}
74
75bool ViewportCuller::isVisible(AABB bb)
76{
77 return cubeInFrustum(bb.x0, bb.y0, bb.z0, bb.x1, bb.y1, bb.z1);
78}
79
80bool ViewportCuller::cubeInFrustum(double x0, double y0, double z0, double x1, double y1, double z1)
81{
82 x0-=xOff;
83 y0-=yOff;
84 z0-=zOff;
85 x1-=xOff;
86 y1-=yOff;
87 z1-=zOff;
88 double xd = (x1-x0)/2.0f;
89 double yd = (y1-y0)/2.0f;
90 double zd = (z1-z0)/2.0f;
91
92 double xc = x0+xd;
93 double yc = y0+yd;
94 double zc = z0+zd;
95 double r = _max(xd, yd, zd)*1.5f;
96
97 if (!faces[0].inFront(xc, yc, zc, r)) return false;
98 if (!faces[1].inFront(xc, yc, zc, r)) return false;
99 if (!faces[2].inFront(xc, yc, zc, r)) return false;
100 if (!faces[3].inFront(xc, yc, zc, r)) return false;
101 if (!faces[4].inFront(xc, yc, zc, r)) return false;
102 if (!faces[5].inFront(xc, yc, zc, r)) return false;
103
104 if (!faces[0].inFront(x0, y0, z0, x1, y1, z1)) return false;
105 if (!faces[1].inFront(x0, y0, z0, x1, y1, z1)) return false;
106 if (!faces[2].inFront(x0, y0, z0, x1, y1, z1)) return false;
107 if (!faces[3].inFront(x0, y0, z0, x1, y1, z1)) return false;
108 if (!faces[4].inFront(x0, y0, z0, x1, y1, z1)) return false;
109 if (!faces[5].inFront(x0, y0, z0, x1, y1, z1)) return false;
110 return true;
111
112}
113
114bool ViewportCuller::cubeFullyInFrustum(double x0, double y0, double z0, double x1, double y1, double z1)
115{
116 x0-=xOff;
117 y0-=yOff;
118 z0-=zOff;
119 x1-=xOff;
120 y1-=yOff;
121 z1-=zOff;
122
123 double xd = (x1-x0)/2.0f;
124 double yd = (y1-y0)/2.0f;
125 double zd = (z1-z0)/2.0f;
126
127 double xc = x0+xd;
128 double yc = y0+yd;
129 double zc = z0+zd;
130 double r = _max(xd, yd, zd)*1.5f;
131
132 if (!faces[0].inFront(xc, yc, zc, r)) return false;
133 if (!faces[1].inFront(xc, yc, zc, r)) return false;
134 if (!faces[2].inFront(xc, yc, zc, r)) return false;
135 if (!faces[3].inFront(xc, yc, zc, r)) return false;
136 if (!faces[4].inFront(xc, yc, zc, r)) return false;
137 if (!faces[5].inFront(xc, yc, zc, r)) return false;
138
139
140 if (!faces[0].fullyInFront(x0, y0, z0, x1, y1, z1)) return false;
141 if (!faces[1].fullyInFront(x0, y0, z0, x1, y1, z1)) return false;
142 if (!faces[2].fullyInFront(x0, y0, z0, x1, y1, z1)) return false;
143 if (!faces[3].fullyInFront(x0, y0, z0, x1, y1, z1)) return false;
144 if (!faces[4].fullyInFront(x0, y0, z0, x1, y1, z1)) return false;
145 if (!faces[5].fullyInFront(x0, y0, z0, x1, y1, z1)) return false;
146 return true;
147}
148
149double ViewportCuller::_max(double a, double b, double c)
150{
151 return (a>b?a>c?c:a:b>c?b:c);
152}
153
154void ViewportCuller::prepare(double xOff, double yOff, double zOff)
155{
156 this->xOff = xOff;
157 this->yOff = yOff;
158 this->zOff = zOff;
159}