Skip to content

Commit bcbd0e3

Browse files
committed
Working node network ;)
1 parent c6da15a commit bcbd0e3

File tree

4 files changed

+111
-33
lines changed

4 files changed

+111
-33
lines changed

Blobtory/Scripts/planet_former/CubeFormer.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ class CubeFormer:
1313
radius = PTAFloat([0])
1414
isWater = False
1515

16-
def __init__(self, winCreator: WindowCreator, width: int, length: int, height: int, spacing: float):
16+
def __init__(self, winCreator: WindowCreator, name: str, width: int, length: int, height: int, spacing: float):
17+
self.name = name
1718
self.winCreator = winCreator
1819
self.size = LVecBase3i(width, length, height)
1920
self.spacing = spacing
@@ -23,7 +24,7 @@ def __init__(self, winCreator: WindowCreator, width: int, length: int, height: i
2324

2425
def GenerateCube(self) -> Texture:
2526
if self.vertexBuffer is None:
26-
self.vertexBuffer = deepcopy(Texture("vertex buffer"))
27+
self.vertexBuffer = deepcopy(Texture("vertex buffer"+self.name))
2728
self.vertexBuffer.setup_3d_texture(self.size[0], self.size[1], self.size[2], Texture.T_float, Texture.F_rgba32)
2829

2930
if self.__cubeBufferCreatorComputeNode is None:

Blobtory/Scripts/planet_former/MarchingCubes.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ def __init__(self, cubeformer: CubeFormer):
2525
self.cubeformer = cubeformer
2626
self.winCreator = cubeformer.winCreator
2727
self.size = cubeformer.size
28-
self.cubeVertexBuffer = cubeformer.vertexBuffer
2928
self.edgeVertexCount = self.cubeformer.vertexCount*3
3029

3130
def EdgeGenerator(self) -> Texture:
@@ -42,7 +41,7 @@ def EdgeGenerator(self) -> Texture:
4241
self.edgeBufferGeneratorNode.set_shader(shader)
4342
self.edgeBufferGeneratorNode.set_shader_input("isoLevel", 0.5)
4443
self.edgeBufferGeneratorNode.set_shader_input("size", self.size)
45-
self.edgeBufferGeneratorNode.set_shader_input("vertexBufferWAlphaCube", self.cubeVertexBuffer)
44+
self.edgeBufferGeneratorNode.set_shader_input("vertexBufferWAlphaCube", self.cubeformer.vertexBuffer)
4645
self.edgeBufferGeneratorNode.set_shader_input("vertexBufferEdge", self.edgeVertexBuffer)
4746

4847
yass = LVecBase3i(math.ceil(self.size[0]*3 / 16), math.ceil(self.size[1] / 8), math.ceil(self.size[2] / 8))
@@ -54,7 +53,7 @@ def EdgeGenerator(self) -> Texture:
5453

5554
def MarchCube(self):
5655
if self.atomic is None:
57-
self.atomic = copy(Texture("atomic int"))
56+
self.atomic = deepcopy(Texture("atomic int"))
5857
self.atomic.setupBufferTexture(1, Texture.T_int, Texture.F_r32i, GeomEnums.UH_dynamic)
5958

6059
if self.triangleBuffer is None:
@@ -83,7 +82,7 @@ def MarchCube(self):
8382
self.cubeMarchBufferGeneratorNode.set_shader_input("size", self.size)
8483
self.cubeMarchBufferGeneratorNode.set_shader_input("triagIndexBuffer", self.atomic)
8584

86-
self.cubeMarchBufferGeneratorNode.set_shader_input("vertexBufferWAlphaCube", self.cubeVertexBuffer)
85+
self.cubeMarchBufferGeneratorNode.set_shader_input("vertexBufferWAlphaCube", self.cubeformer.vertexBuffer)
8786
self.cubeMarchBufferGeneratorNode.set_shader_input("vertexBufferEdge", self.edgeVertexBuffer)
8887
self.cubeMarchBufferGeneratorNode.set_shader_input("triangleBuffer", self.triangleBuffer)
8988
self.cubeMarchBufferGeneratorNode.set_shader_input("triangulationBuffer", self.triangulationBuffer)
@@ -122,18 +121,18 @@ def GenerateMesh(self):
122121
self.winCreator.base.render.find("**/node").removeNode()
123122

124123
self.geomPath = self.winCreator.base.render.attach_new_node(node)
125-
self.geomPath.setPos(
126-
-self.size.getX()*0.5*self.cubeformer.spacing,
127-
-self.size.getY()*0.5*self.cubeformer.spacing,
128-
-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)
129128

130129
self.winCreator.pipelineSwitcher.AddModelWithShaderGeneralName(self.geomPath, "assets/shaders/planets/planet")
131130
self.geomPath.set_shader_input('vertexBufferEdge', self.edgeVertexBuffer)
132131
self.geomPath.set_shader_input('triangleBuffer', self.triangleBuffer)
133132
self.geomPath.set_shader_input('normalBuffer', self.normalBuffer)
134133

135134
myMaterial = Material()
136-
myMaterial.setShininess(0.8) # Make this material shiny
135+
myMaterial.setShininess(0.4) # Make this material shiny
137136
self.geomPath.setMaterial(myMaterial)
138137

139138
myMarchCubeMatsTex = self.winCreator.base.loader.loadTexture(
Lines changed: 98 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,41 @@
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

310
from Blobtory.Scripts.Pipeline.WindowCreator import WindowCreator
411
from Blobtory.Scripts.planet_former.CubeFormer import CubeFormer
512
from Blobtory.Scripts.planet_former.MarchingCubes import MarchingCubes
613
from Blobtory.Scripts.Pipeline.PipelineInstancing import PipelineInstancing
714

15+
816
class 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

assets/shaders/compute/cubemarcher.glsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,14 @@ void main() {
6565
vec3 v1 = imageLoad(vertexBufferEdge, vertexID.xyz).xyz;
6666

6767
ivec4 globalIndexForC = globalEdgeFromLocal[imageLoad(triangulationBuffer, ivec2(i+2, cubeIndex)).x];
68-
vertexID = ivec4(id+globalIndexForC.xyz+(ivec3(size.x, 0, 0)*globalIndexForC.w), cubeIndex);
68+
vertexID = ivec4(id+globalIndexForC.xyz+(ivec3(size.x, 0, 0)*globalIndexForC.w), 0);
6969
imageStore(triangleBuffer, triangleIDIndex+2, vertexID);
7070
vec3 v2 = imageLoad(vertexBufferEdge, vertexID.xyz).xyz;
7171

7272
vec3 normal = normalize(cross(v2-v0, v1-v0));
7373
//vec3 normal = normalize(v2+v0+v1);
7474
int type = int(distance(vec3(512), v1)/51);
75-
if (isWater) type = 13;
75+
if (isWater) type = 13; //int(sin(dot(normal,vec3(1)))*1+13);
7676
// if(type > 7) if(dot(normalize(vec3(512)-v1), normal)<0.5) type = 6;
7777
imageStore(normalBuffer, int(triangleIDIndex/3), vec4(normal, type));
7878

0 commit comments

Comments
 (0)