1- from panda3d .core import PTAFloat
1+ import array
2+
3+ from direct .task import Task
4+ from panda3d .core import PTAFloat , LVecBase3f
5+ import numpy as np
6+ from typing import Dict
7+ import cv2
8+ import copy
29
310from Blobtory .Scripts .Pipeline .WindowCreator import WindowCreator
411from Blobtory .Scripts .planet_former .CubeFormer import CubeFormer
512from Blobtory .Scripts .planet_former .MarchingCubes import MarchingCubes
613from Blobtory .Scripts .Pipeline .PipelineInstancing import PipelineInstancing
714
15+
816class PlanetGenerator :
17+ shouldUpdatePhysicsMeshes = False
18+ nodeDict : Dict = {}
19+ listOfItems = None
20+
921 def __init__ (self , winCreator : WindowCreator , gridSize : int , radius : float ):
1022 self .radius = radius
1123 self .winCreator = winCreator
1224
1325 # Setup Mesh
14- self .cubeformer : CubeFormer = CubeFormer (self .winCreator , gridSize , gridSize , gridSize , winCreator .cubeSpacing )
26+ self .cubeformer : CubeFormer = CubeFormer (self .winCreator , "Normal" , gridSize , gridSize , gridSize , winCreator .cubeSpacing )
1527 self .cubeformer .GenerateCube ()
16- self .cubeformer .GenerateNoiseSphere (self .radius )
17-
1828 self .marchingCubes : MarchingCubes = MarchingCubes (self .cubeformer )
19- self .marchingCubes .EdgeGenerator ()
20- self .marchingCubes .MarchCube ()
21- self .marchingCubes .GenerateMesh ()
2229
2330 # Setup Navigation Mesh
24- self .cubeformerNav : CubeFormer = CubeFormer (self .winCreator , gridSize // 4 , gridSize // 4 , gridSize // 4 , winCreator .cubeSpacing * 4 )
31+ self .cubeformerNav : CubeFormer = CubeFormer (self .winCreator , "Navigation" , gridSize // 8 , gridSize // 8 , gridSize // 8 , winCreator .cubeSpacing * 8 )
2532 self .cubeformerNav .GenerateCube ()
26- self .cubeformerNav .GenerateNoiseSphere (self .radius )
27-
2833 self .marchingCubesNav : MarchingCubes = MarchingCubes (self .cubeformerNav )
29- self .marchingCubesNav .EdgeGenerator ()
30- self .marchingCubesNav .MarchCube ()
3134
3235 # Setup Water Mesh
33- self .cubeformerWater : CubeFormer = CubeFormer (self .winCreator , gridSize // 4 , gridSize // 4 , gridSize // 4 , winCreator .cubeSpacing * 4 )
36+ self .cubeformerWater : CubeFormer = CubeFormer (self .winCreator , "Water" , gridSize // 4 , gridSize // 4 , gridSize // 4 , winCreator .cubeSpacing * 4 )
3437 self .cubeformerWater .GenerateCube ()
35- self .cubeformerWater .mouseTime .setData (PTAFloat ([10 , 0 , 0 , 10 .1 ]))
38+ self .cubeformerWater .mouseTime .setData (PTAFloat ([10 , 0 , 0 , 6 .1 ]))
3639 self .cubeformerWater .GenerateNoiseSphere (self .radius * 0.98 )
3740 self .cubeformerWater .isWater = True
3841
@@ -41,6 +44,9 @@ def __init__(self, winCreator: WindowCreator, gridSize: int, radius: float):
4144 self .marchingCubesWater .MarchCube ()
4245 self .marchingCubesWater .GenerateMesh ()
4346
47+ self .sphere = self .winCreator .base .loader .loadModel ("assets/models/icosphere" )
48+ self .sphere2 = self .winCreator .base .loader .loadModel ("assets/models/icosphere" )
49+
4450 # sphere = self.winCreator.base.loader.loadModel("assets/models/icosphere")
4551 # PipelineInstancing.RenderThisModelAtVertexesFrom3DBuffer(sphere, self.cubeformer.vertexBuffer,
4652 # self.cubeformer.size, self.winCreator)
@@ -49,15 +55,87 @@ def __init__(self, winCreator: WindowCreator, gridSize: int, radius: float):
4955 # PipelineInstancing.RenderThisModelAtVertexesFrom3DBuffer(box, self.cubeformerNav.vertexBuffer,
5056 # self.cubeformerNav.size, self.winCreator)
5157
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+
68+ self .sphere2 .reparentTo (self .winCreator .base .render )
69+ self .sphere2 .setScale (10 )
70+ self .sphere2 .setPos (examplePoint [0 ], examplePoint [1 ], examplePoint [2 ])
71+ print (examplePoint , neighbourPoints )
72+
73+ # PipelineInstancing.RenderThisModelAtVertexesFrom3DBuffer(sphere, self.marchingCubesNav.edgeVertexBuffer, self.marchingCubesNav.size, self.winCreator)
74+ PipelineInstancing .RenderThisModelAtVertexes (self .sphere , list (neighbourPoints ), self .winCreator )
75+
5276 def RegenPlanet (self ):
5377 self .winCreator .baseData .debuggerPlanetFormer .Inform ("Regenerating planet" )
54-
5578 self .cubeformerNav .GenerateNoiseSphere (self .radius )
56- self .marchingCubesNav .EdgeGenerator ()
57- self .marchingCubesNav .MarchCube ()
58- self .marchingCubesNav .GenerateMesh ()
59-
6079 self .cubeformer .GenerateNoiseSphere (self .radius )
80+ self .UpdatePlanet ()
81+
82+ def UpdatePlanet (self ):
6183 self .marchingCubes .EdgeGenerator ()
6284 self .marchingCubes .MarchCube ()
63- self .marchingCubes .GenerateMesh ()
85+ #self.marchingCubes.GenerateMesh()
86+ self .shouldUpdatePhysicsMeshes = True
87+
88+ def UpdatePhysicsMesh (self , task ):
89+ if self .shouldUpdatePhysicsMeshes :
90+ # Generate marching
91+ self .marchingCubesNav .EdgeGenerator ()
92+ self .marchingCubesNav .MarchCube ()
93+ self .marchingCubesNav .GenerateMesh ()
94+
95+ # Extract Mesh Data (Tri Indexes and Vertexes)
96+ self .winCreator .base .graphicsEngine .extractTextureData (self .marchingCubesNav .edgeVertexBuffer ,
97+ self .winCreator .base .win .gsg )
98+ ramImageVertex = self .marchingCubesNav .edgeVertexBuffer .getRamImage ()
99+ output = np .frombuffer (ramImageVertex , dtype = np .float32 )
100+ output : np .ndarray = output .reshape ((self .marchingCubesNav .size [2 ],
101+ self .marchingCubesNav .size [1 ],
102+ self .marchingCubesNav .size [0 ]* 3 , 4 ))
103+
104+ self .winCreator .base .graphicsEngine .extractTextureData (self .marchingCubesNav .triangleBuffer ,
105+ self .winCreator .base .win .gsg )
106+ ramImage = self .marchingCubesNav .triangleBuffer .getRamImage ()
107+ outputTriangle = memoryview (ramImage ).cast ("i" )
108+
109+ # Restructure that data to be a node network instead using a dictionary
110+ outputR = map (tuple , output .reshape ((self .marchingCubesNav .size [0 ]* 3 *
111+ self .marchingCubesNav .size [1 ] *
112+ self .marchingCubesNav .size [2 ], 4 )))
113+ self .nodeDict = dict ((el , set ([])) for el in outputR )
114+ del outputR
115+
116+ buffer = np .empty (12 , dtype = int )
117+
118+ triagIndexCount = self .marchingCubesNav .vertexCount * 4
119+ for count , x in enumerate (outputTriangle ):
120+ buffer [count % 12 ] = x
121+ 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 ]])
126+
127+ self .nodeDict [v1 ].add (v2 )
128+ self .nodeDict [v1 ].add (v3 )
129+
130+ self .nodeDict [v2 ].add (v1 )
131+ self .nodeDict [v2 ].add (v3 )
132+
133+ self .nodeDict [v3 ].add (v2 )
134+ self .nodeDict [v3 ].add (v1 )
135+
136+ if count > triagIndexCount :
137+ break
138+ self .listOfItems = (item [0 ] for item in self .nodeDict .items () if len (item [1 ]) > 0 )
139+
140+ self .shouldUpdatePhysicsMeshes = False
141+ return Task .again
0 commit comments