33from direct .task import Task
44from panda3d .core import PTAFloat , LVecBase3f
55import numpy as np
6- from typing import Dict
7- import cv2
6+ from typing import Dict , Set
87import copy
98
109from Blobtory .Scripts .Pipeline .WindowCreator import WindowCreator
1110from Blobtory .Scripts .planet_former .CubeFormer import CubeFormer
1211from Blobtory .Scripts .planet_former .MarchingCubes import MarchingCubes
1312from 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
1617class 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
0 commit comments