Fix collisions, mapgen, and voxel-placing
dkl9

dkl9 commited on 2025-183 20:12:05
Showing 5 changed files, with 20 additions and 19 deletions.

... ...
@@ -5,7 +5,7 @@ import mesh
5 5
 def crosshair():
6 6
     return attributes.AttributedEntity(
7 7
         [[-0.03, 0, 0], [0.03, 0, 0], [0, -0.03, 0], [0, 0.03, 0]],
8
-        [0, 0, 0], [1, 1, 1, 1], mode=GL_LINES, hud=True
8
+        [0, 0, 0], [1, 1, 1, 1], texi=-1, mode=GL_LINES, hud=True
9 9
     )
10 10
 
11 11
 def fps():
... ...
@@ -19,7 +19,7 @@ def hand():
19 19
     h.add_sq(1, 1, [0.5, 0, 0], 1)
20 20
     h.add_sq(2, 1, [0, 0.5, 0], 1)
21 21
     h.add_sq(3, 1, [0, 0, 0.5], 1)
22
-    h.pos = [0.8, -0.8, 0.0]
22
+    h.pos = [0.8, -0.8, -0.2]
23 23
     h.rotate(-1, [0, 1, 0])
24 24
     h.rotate(0.1, [1, 0, 0])
25 25
     h.orient[:3, :3] *= 0.2
... ...
@@ -27,6 +27,8 @@ def main():
27 27
         for wr in scene:
28 28
             if wr.dirty:
29 29
                 wr.remesh()
30
+                for i in range(len(VERTEX_ATTRS)):
31
+                    update_attr(wr, i)
30 32
         for ev in pygame.event.get():
31 33
             match ev.type:
32 34
                 case pygame.QUIT:
... ...
@@ -40,25 +40,25 @@ class MapGen(world.WorldHolder):
40 40
         n = 0
41 41
         for i in range(wr.r):
42 42
             for j in range(wr.r):
43
-                h = 4 + 4 * self.perlin(
43
+                h = np.astype(np.floor(4 + 4 * self.perlin(
44 44
                     "height",
45 45
                     np.add(wr.pos[[0, 2]], (i, j)),
46 46
                     np.array([10, 20])
47
-                ) - wr.pos[1]
47
+                ) - wr.pos[1]), int)
48 48
                 if h > 0:
49
-                    wr.grid[i, :min(int(h), wr.r), j] = 3
50
-                if h < wr.r and h > 0:
51
-                    wr.grid[i, int(h), j] = 4
49
+                    wr.grid[i, :min(h, wr.r), j] = 3
50
+                if h < wr.r and h >= 0:
51
+                    wr.grid[i, h, j] = 4
52 52
                     if 2 <= i < wr.r - 2 and 2 <= j < wr.r - 2 and self.poisson(
53 53
                             "trees", wr.pos[[0, 2]], wr.r, (6, 6)
54 54
                         )[i, j] >= 1:
55 55
                         for u in range(1, 6):
56
-                            self.voxel_at(wr.pos + [0, h + u, 0], 5)
56
+                            self.voxel_at(wr.pos + [i, h + u, j], 5)
57 57
                         for u in range(5, 7):
58 58
                             for v in range(-7 + u, 8 - u):
59 59
                                 b = 7 - u - abs(v)
60 60
                                 for w in range(-b, b + 1):
61
-                                    self.voxel_at(wr.pos + [v, h + u, w], 6)
61
+                                    self.voxel_at(wr.pos + [i + v, h + u, j + w], 6)
62 62
         return n
63 63
 
64 64
     def world_min(self, wr):
... ...
@@ -17,22 +17,23 @@ class Player(interactive.InteractiveCamera):
17 17
     def update_motion(self, pressed, mg):
18 18
         netv = [0, 0, 0]
19 19
         for i in range(3):
20
-            for s in range(2):
20
+            for s in range(1, -1, -1):
21 21
                 sf = (-1) ** s
22
-                cp = self.pos + sf * self.vaa_mat()[i]
23
-                if self.collides and mg.voxel_at(cp):
24
-                    pass
25
-                elif self.falls and i == 1 and s == 1:
22
+                cd = 0.3 * sf * self.vaa_mat()[i]
23
+                hit = self.collides and mg.voxel_at(self.pos + cd)
24
+                if i == 1 and sf == -1 and self.falls and not hit:
26 25
                     netv[i] = self.vaa_vel[i] - GRAVITY / FPS
27
-                else:
26
+                if i != 1 or not self.falls or mg.voxel_at(self.pos - cd):
28 27
                     netv[i] += sf * any(pressed[j] for j in ARROWS[2 * i + s])
28
+                if hit:
29
+                    netv[i] = sf * min(0, sf * netv[i])
29 30
         self.vaa_vel = vec(netv)
30 31
 
31 32
     def set_hand(self, new_hand):
32 33
         self.hand = int(new_hand)
33 34
         hg = self.hud["hand"]
34 35
         hg.faces = [(a, self.hand) for (a, _) in hg.faces]
35
-        for i in [1, 3, 4]:
36
+        for i in range(len(VERTEX_ATTRS)):
36 37
             update_attr(hg, i)
37 38
 
38 39
     def handle_event(self, ev, mg, scene):
... ...
@@ -22,11 +22,9 @@ class WorldRegion(mesh.SquareMesh):
22 22
                 for s in range(2):
23 23
                     oob = pos[d] == self.r - 1 and s == 0
24 24
                     oob |= pos[d] == 0 and s == 1
25
-                    if oob:
26
-                        continue
27 25
                     a = (d + 1) * (-1) ** s
28 26
                     o = np.array(axis2offset(a), dtype=np.int64)
29
-                    bc = bool(self.grid[*(pos + o)])
27
+                    bc = not oob and bool(self.grid[*(pos + o)])
30 28
                     if bp ^ bc:
31 29
                         a *= bp - bc
32 30
                         self.add_sq(a, 1, pos + o / 2, pos + (0 if bp else o))
33 31