Skip to content

Commit 686f009

Browse files
committed
The beginning of A*
1 parent bcbd0e3 commit 686f009

6 files changed

Lines changed: 106 additions & 48 deletions

File tree

Blobtory/Scripts/game/SceneBuilder.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ def SetupPlanets(self):
3939

4040
def IncreaseSize(self, planetGen: PlanetGenerator, a):
4141
planetGen.cubeformer.mouseTime.setData(PTAFloat([10, 0, 0, planetGen.cubeformer.mouseTime.getElement(3)+a]))
42-
planetGen.cubeformerNav.mouseTime.setData(PTAFloat([10, 0, 0, planetGen.cubeformer.mouseTime.getElement(3) + a]))
4342
planetGen.RegenPlanet()
4443

4544
def SetupLighting(self):
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from typing import Dict, Set, List, Tuple
2+
from Blobtory.Scripts.planet_former.NodeRef import NodeRef, NodeKey
3+
4+
5+
class AStar:
6+
nodeDict: Dict
7+
8+
def __init__(self, nodeDict: Dict):
9+
self.nodeDict = nodeDict
10+
11+
def GetPathFromTo(self,
12+
pFrom: Tuple[float, float, float, float],
13+
pTo: Tuple[float, float, float, float]
14+
) -> List[Tuple[float, float, float, float]]:
15+
neighboursNeighbourPoints = []
16+
17+
neighbourPointsTo: Set[NodeRef] = self.nodeDict[pTo]
18+
neighbourPointsFrom: Set[NodeRef] = self.nodeDict[pFrom]
19+
20+
for point in neighbourPointsTo:
21+
# keyList = list(self.nodeDict.keys())
22+
# print(keyList[keyList.index(point)].point)
23+
points = self.nodeDict[point]
24+
neighboursNeighbourPoints.extend([point.point for point in points])
25+
26+
for point in neighbourPointsFrom:
27+
points = self.nodeDict[point]
28+
neighboursNeighbourPoints.extend([point.point for point in points])
29+
30+
return neighboursNeighbourPoints

Blobtory/Scripts/planet_former/MarchingCubes.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,10 @@ def GenerateMesh(self):
121121
self.winCreator.base.render.find("**/node").removeNode()
122122

123123
self.geomPath = self.winCreator.base.render.attach_new_node(node)
124-
# self.geomPath.setPos(
125-
# -self.size.getX()*0.5*self.cubeformer.spacing,
126-
# -self.size.getY()*0.5*self.cubeformer.spacing,
127-
# -self.size.getZ()*0.5*self.cubeformer.spacing)
124+
self.geomPath.setPos(
125+
-self.size.getX()*0.5*self.cubeformer.spacing,
126+
-self.size.getY()*0.5*self.cubeformer.spacing,
127+
-self.size.getZ()*0.5*self.cubeformer.spacing)
128128

129129
self.winCreator.pipelineSwitcher.AddModelWithShaderGeneralName(self.geomPath, "assets/shaders/planets/planet")
130130
self.geomPath.set_shader_input('vertexBufferEdge', self.edgeVertexBuffer)
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
class NodeRef:
2+
point: (float, float, float, float)
3+
relativeDist: float = None
4+
5+
def __init__(self, point: (float, float, float, float)):
6+
self.point = point
7+
8+
def __hash__(self):
9+
return hash(self.point)
10+
11+
def __getitem__(self, key):
12+
return self.point[key]
13+
14+
def __eq__(self, other):
15+
return hash(self) == hash(other)
16+
17+
18+
class NodeKey:
19+
point: (float, float, float, float)
20+
weight: float = 1
21+
22+
def __init__(self, point: (float, float, float, float)):
23+
self.point = point
24+
25+
def __hash__(self):
26+
return hash(self.point)
27+
28+
def __getitem__(self, key):
29+
return self.point[key]
30+
31+
def __eq__(self, other):
32+
return hash(self) == hash(other)

Blobtory/Scripts/planet_former/PlanetGenerator.py

Lines changed: 39 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,20 @@
33
from direct.task import Task
44
from panda3d.core import PTAFloat, LVecBase3f
55
import numpy as np
6-
from typing import Dict
7-
import cv2
6+
from typing import Dict, Set
87
import copy
98

109
from Blobtory.Scripts.Pipeline.WindowCreator import WindowCreator
1110
from Blobtory.Scripts.planet_former.CubeFormer import CubeFormer
1211
from Blobtory.Scripts.planet_former.MarchingCubes import MarchingCubes
1312
from Blobtory.Scripts.Pipeline.PipelineInstancing import PipelineInstancing
13+
from Blobtory.Scripts.planet_former.NodeRef import NodeRef, NodeKey
14+
from Blobtory.Scripts.planet_former.AStar import AStar
1415

1516

1617
class PlanetGenerator:
1718
shouldUpdatePhysicsMeshes = False
18-
nodeDict: Dict = {}
19-
listOfItems = None
19+
aStarHandler: AStar
2020

2121
def __init__(self, winCreator: WindowCreator, gridSize: int, radius: float):
2222
self.radius = radius
@@ -25,11 +25,13 @@ def __init__(self, winCreator: WindowCreator, gridSize: int, radius: float):
2525
# Setup Mesh
2626
self.cubeformer: CubeFormer = CubeFormer(self.winCreator, "Normal", gridSize, gridSize, gridSize, winCreator.cubeSpacing)
2727
self.cubeformer.GenerateCube()
28+
self.cubeformer.mouseTime.setData(PTAFloat([10, 0, 0, 60.1]))
2829
self.marchingCubes: MarchingCubes = MarchingCubes(self.cubeformer)
2930

3031
# Setup Navigation Mesh
3132
self.cubeformerNav: CubeFormer = CubeFormer(self.winCreator, "Navigation", gridSize//8, gridSize//8, gridSize//8, winCreator.cubeSpacing*8)
3233
self.cubeformerNav.GenerateCube()
34+
self.cubeformerNav.mouseTime = self.cubeformer.mouseTime
3335
self.marchingCubesNav: MarchingCubes = MarchingCubes(self.cubeformerNav)
3436

3537
# Setup Water Mesh
@@ -44,34 +46,17 @@ def __init__(self, winCreator: WindowCreator, gridSize: int, radius: float):
4446
self.marchingCubesWater.MarchCube()
4547
self.marchingCubesWater.GenerateMesh()
4648

47-
self.sphere = self.winCreator.base.loader.loadModel("assets/models/icosphere")
49+
self.sphere1 = self.winCreator.base.loader.loadModel("assets/models/icosphere")
4850
self.sphere2 = self.winCreator.base.loader.loadModel("assets/models/icosphere")
49-
50-
# sphere = self.winCreator.base.loader.loadModel("assets/models/icosphere")
51-
# PipelineInstancing.RenderThisModelAtVertexesFrom3DBuffer(sphere, self.cubeformer.vertexBuffer,
52-
# self.cubeformer.size, self.winCreator)
53-
54-
# box = self.winCreator.base.loader.loadModel("box")
55-
# PipelineInstancing.RenderThisModelAtVertexesFrom3DBuffer(box, self.cubeformerNav.vertexBuffer,
56-
# self.cubeformerNav.size, self.winCreator)
57-
58-
self.RegenPlanet()
59-
# self.winCreator.base.taskMgr.setupTaskChain('physics', numThreads=1)
60-
self.winCreator.base.taskMgr.doMethodLater(1, self.UpdatePhysicsMesh, "Planet Physics Updater"''', taskChain="physics"''')
61-
self.winCreator.base.accept("r", self.TryNavmesh)
62-
self.winCreator.base.accept("r-repeat", self.TryNavmesh)
63-
64-
def TryNavmesh(self):
65-
examplePoint = next(self.listOfItems)
66-
neighbourPoints = self.nodeDict[examplePoint]
67-
6851
self.sphere2.reparentTo(self.winCreator.base.render)
6952
self.sphere2.setScale(10)
70-
self.sphere2.setPos(examplePoint[0], examplePoint[1], examplePoint[2])
71-
print(examplePoint, neighbourPoints)
7253

73-
# PipelineInstancing.RenderThisModelAtVertexesFrom3DBuffer(sphere, self.marchingCubesNav.edgeVertexBuffer, self.marchingCubesNav.size, self.winCreator)
74-
PipelineInstancing.RenderThisModelAtVertexes(self.sphere, list(neighbourPoints), self.winCreator)
54+
self.sphere3 = self.winCreator.base.loader.loadModel("assets/models/icosphere")
55+
self.sphere3.reparentTo(self.winCreator.base.render)
56+
self.sphere3.setScale(10)
57+
58+
self.RegenPlanet()
59+
self.winCreator.base.taskMgr.doMethodLater(1, self.UpdatePhysicsMesh, "Planet Physics Updater")
7560

7661
def RegenPlanet(self):
7762
self.winCreator.baseData.debuggerPlanetFormer.Inform("Regenerating planet")
@@ -82,15 +67,14 @@ def RegenPlanet(self):
8267
def UpdatePlanet(self):
8368
self.marchingCubes.EdgeGenerator()
8469
self.marchingCubes.MarchCube()
85-
#self.marchingCubes.GenerateMesh()
70+
self.marchingCubes.GenerateMesh()
8671
self.shouldUpdatePhysicsMeshes = True
8772

8873
def UpdatePhysicsMesh(self, task):
8974
if self.shouldUpdatePhysicsMeshes:
9075
# Generate marching
9176
self.marchingCubesNav.EdgeGenerator()
9277
self.marchingCubesNav.MarchCube()
93-
self.marchingCubesNav.GenerateMesh()
9478

9579
# Extract Mesh Data (Tri Indexes and Vertexes)
9680
self.winCreator.base.graphicsEngine.extractTextureData(self.marchingCubesNav.edgeVertexBuffer,
@@ -110,7 +94,7 @@ def UpdatePhysicsMesh(self, task):
11094
outputR = map(tuple, output.reshape((self.marchingCubesNav.size[0]*3 *
11195
self.marchingCubesNav.size[1] *
11296
self.marchingCubesNav.size[2], 4)))
113-
self.nodeDict = dict((el, set([])) for el in outputR)
97+
nodeDict = dict((NodeKey(el), set([])) for el in outputR)
11498
del outputR
11599

116100
buffer = np.empty(12, dtype=int)
@@ -119,23 +103,36 @@ def UpdatePhysicsMesh(self, task):
119103
for count, x in enumerate(outputTriangle):
120104
buffer[count % 12] = x
121105
if count % 12 == 11:
122-
print(output.shape, buffer)
123-
v1 = tuple(output[buffer[2], buffer[1], buffer[0]])
124-
v2 = tuple(output[buffer[6], buffer[5], buffer[4]])
125-
v3 = tuple(output[buffer[10], buffer[9], buffer[8]])
106+
v1: NodeRef = NodeRef(tuple(output[buffer[2], buffer[1], buffer[0]]))
107+
v2: NodeRef = NodeRef(tuple(output[buffer[6], buffer[5], buffer[4]]))
108+
v3: NodeRef = NodeRef(tuple(output[buffer[10], buffer[9], buffer[8]]))
126109

127-
self.nodeDict[v1].add(v2)
128-
self.nodeDict[v1].add(v3)
110+
nodeDict[v1].add(v2)
111+
nodeDict[v1].add(v3)
129112

130-
self.nodeDict[v2].add(v1)
131-
self.nodeDict[v2].add(v3)
113+
nodeDict[v2].add(v1)
114+
nodeDict[v2].add(v3)
132115

133-
self.nodeDict[v3].add(v2)
134-
self.nodeDict[v3].add(v1)
116+
nodeDict[v3].add(v2)
117+
nodeDict[v3].add(v1)
135118

136119
if count > triagIndexCount:
137120
break
138-
self.listOfItems = (item[0] for item in self.nodeDict.items() if len(item[1]) > 0)
121+
listOfItems = (item[0] for item in nodeDict.items() if len(item[1]) > 0)
122+
123+
examplePointFrom: NodeKey = next(listOfItems)
124+
for i in range(128): next(listOfItems)
125+
examplePointTo: NodeKey = next(listOfItems)
126+
127+
self.sphere2.setPos(examplePointFrom[0], examplePointFrom[1], examplePointFrom[2])
128+
self.sphere3.setPos(examplePointTo[0], examplePointTo[1], examplePointTo[2])
129+
130+
self.aStarHandler = AStar(nodeDict)
131+
PipelineInstancing.RenderThisModelAtVertexes(self.sphere1,
132+
self.aStarHandler.GetPathFromTo(
133+
examplePointFrom.point,
134+
examplePointTo.point),
135+
self.winCreator)
139136

140137
self.shouldUpdatePhysicsMeshes = False
141138
return Task.again

version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
version = "0.0.4"
1+
version = "0.0.5"
22
print(version)

0 commit comments

Comments
 (0)