# ZScript: Moosh 3D

May 19th, 2017
46
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. ffc script Test{
2.     void run(){
3.         int yaw;
4.         int pitch;
5.         int roll;
6.         while(true){
8.                 pitch = WrapDegrees(pitch-1.5);
10.                 pitch = WrapDegrees(pitch+1.5);
12.                 yaw = WrapDegrees(yaw-1.5);
14.                 yaw = WrapDegrees(yaw+1.5);
16.                 roll = WrapDegrees(roll-1.5);
18.                 roll = WrapDegrees(roll+1.5);
19.             int tex[6] = {1540, 1541, 1542, 1543, 1544, 1545};
20.             DrawCube(2, 32, 32, 16, yaw, pitch, roll, tex, 1, 7);
21.             WaitNoAction();
22.         }
23.     }
24. }
25.
26. void DrawCube(int layer, int x, int y, int scale, int yaw, int pitch, int roll, int tex, int texwidth, int cs){
27.     int cx[8];
28.     int cy[8];
29.     int cz[8];
30.     //Initialize all 8 points in the default position
31.     for(int i=0; i<4; i++){
32.         cx[i] = VectorX3D(scale, -45+90*i, -45);
33.         cy[i] = VectorY3D(scale, -45+90*i, -45);
34.         cz[i] = scale/2;
35.
36.         cx[i+4] = VectorX3D(scale, -45+90*i, 90+45);
37.         cy[i+4] = VectorY3D(scale, -45+90*i, 90+45);
38.         cz[i+4] = -scale/2;
39.     }
40.
41.     //Rotate from the default position to the desired rotation
42.     RotateX3D(yaw, cx, cy, cz);
43.     RotateY3D(pitch, cx, cy, cz);
44.     RotateZ3D(roll, cx, cy, cz);
45.
46.     //Draw all six faces of the cube
47.     DrawCubeFace(layer, x, y, 0, 1, 2, 3, tex[0], texwidth, cs, cx, cy, cz);
48.     DrawCubeFace(layer, x, y, 4, 5, 6, 7, tex[1], texwidth, cs, cx, cy, cz);
49.
50.     DrawCubeFace(layer, x, y, 1, 2, 4, 7, tex[2], texwidth, cs, cx, cy, cz);
51.     DrawCubeFace(layer, x, y, 3, 0, 6, 5, tex[3], texwidth, cs, cx, cy, cz);
52.
53.     DrawCubeFace(layer, x, y, 0, 1, 7, 6, tex[4], texwidth, cs, cx, cy, cz);
54.     DrawCubeFace(layer, x, y, 2, 3, 5, 4, tex[5], texwidth, cs, cx, cy, cz);
55. }
56.
57. void DrawCubeFace(int layer, int x, int y, int p1, int p2, int p3, int p4, int tex, int texwidth, int cs, int cx, int cy, int cz){
59.     if(CubeCenterZ(p1, p2, p3, p4, cz)>=0){
60.         //Assign points from cube arrays to quad array
61.         int pos[12];
62.
63.         pos[0] = x+cx[p1];
64.         pos[1] = y+cy[p1];
65.         pos[2] = cy[p1];
66.
67.         pos[3] = x+cx[p2];
68.         pos[4] = y+cy[p2];
69.         pos[5] = cy[p2];
70.
71.         pos[6] = x+cx[p3];
72.         pos[7] = y+cy[p3];
73.         pos[8] = cy[p3];
74.
75.         pos[9] = x+cx[p4];
76.         pos[10] = y+cy[p4];
77.         pos[11] = cy[p4];
78.
79.         //Some more garbage
80.         int w = texwidth*16-1;
81.         int uv[8] = {0,0,  0,w,  w,w,  w,0};
82.         int csets[4] = {cs, cs, cs, cs};
83.         int size[2] = {texwidth, texwidth};
84.
86.     }
87. }
88.
89. int CubeCenterZ(int p1, int p2, int p3, int p4, int cz){
90.     return (cz[p1]+cz[p2]+cz[p3]+cz[p4])/4;
91. }
92.
93. void RotateX3D(int angle, int cx, int cy, int cz){
94.     for(int i=0; i<SizeOfArray(cx); i++){
95.         int y = cy[i];
96.         int z = cz[i];
97.
98.         cy[i] = y * Cos(angle) - z * Sin(angle);
99.         cz[i] = z * Cos(angle) + y * Sin(angle);
100.     }
101. }
102.
103. void RotateY3D(int angle, int cx, int cy, int cz){
104.     for(int i=0; i<SizeOfArray(cx); i++){
105.         int x = cx[i];
106.         int z = cz[i];
107.
108.         cx[i] = x * Cos(angle) - z * Sin(angle);
109.         cz[i] = z * Cos(angle) + x * Sin(angle);
110.     }
111. }
112.
113. void RotateZ3D(int angle, int cx, int cy, int cz){
114.     for(int i=0; i<SizeOfArray(cx); i++){
115.         int x = cx[i];
116.         int y = cy[i];
117.
118.         cx[i] = x * Cos(angle) - y * Sin(angle);
119.         cy[i] = y * Cos(angle) + x * Sin(angle);
120.     }
121. }
122.
123. int VectorX3D(int distance, int yaw, int pitch){
124.     return distance*Sin(pitch)*Cos(yaw);
125. }
126.
127. int VectorY3D(int distance, int yaw, int pitch){
128.     return distance*Sin(pitch)*Sin(yaw);
129. }
130.
131. int VectorZ3D(int distance, int yaw, int pitch){
132.     return distance*Cos(pitch);
133. }
RAW Paste Data