Skip to content

Commit 62e5cf9

Browse files
* Complete reorganisation
1 parent 1d09af7 commit 62e5cf9

File tree

6 files changed

+384
-5
lines changed

6 files changed

+384
-5
lines changed
5 KB
Binary file not shown.

import-export-clausewitz/__init__.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from bpy_types import (Operator)
33
from bpy_extras.io_utils import (ImportHelper)
44
from bpy.props import (StringProperty, BoolProperty, EnumProperty)
5+
from . import (importer)
56

67
bl_info = {
78
"name": "Clausewitz Import/Export",
@@ -19,8 +20,8 @@ class ClausewitzExporter(Operator):
1920
bl_idname = "clausewitz.exporter"
2021
bl_label = "Export .mesh (Clausewitz Engine)"
2122

22-
def execute(self, context):
23-
return {'FINISHED'}
23+
def execute(self, context):
24+
return {'FINISHED'}
2425

2526
class ClausewitzImporter(Operator, ImportHelper):
2627
"""Clausewitz Importer"""
@@ -36,9 +37,9 @@ class ClausewitzImporter(Operator, ImportHelper):
3637
)
3738

3839
def execute(self, context):
39-
#pdx = PdxFile(self.filepath)
40-
#pdx.ReadFile()
41-
#pdx.AddBlenderMesh()
40+
pdx = importer.PdxFileImporter(self.filepath)
41+
pdx.ReadFile()
42+
pdx.AddBlenderMesh()
4243

4344
return {'FINISHED'}
4445

Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
import bpy
2+
import bmesh
3+
import os
4+
import io
5+
from pathlib import Path
6+
from . import (pdx_data, tree, utils)
7+
8+
class PdxFileImporter:
9+
def __init__(self, filename):
10+
self.filename = filename
11+
self.dataTree = tree.Tree(tree.TreeNode("root"))
12+
13+
def AddBlenderMesh(self):
14+
meshNode = self.dataTree.search("mesh")
15+
16+
if not meshNode.hasSubNode("uv_map"):
17+
meshNode = meshNode.search("mesh", False)
18+
19+
if self.filename.find("/") != -1:
20+
meshName = self.filename.rsplit("/", 1)[1].replace(".mesh", "") #self.dataTree.rootNode.searchForParentNode(meshNode.id).name
21+
elif self.filename.find("\\") != -1:
22+
meshName = self.filename.rsplit("\\", 1)[1].replace(".mesh", "") #self.dataTree.rootNode.searchForParentNode(meshNode.id).name
23+
else:
24+
meshName = "ClausewitzMesh"
25+
26+
mesh = pdx_data.PdxMesh(meshNode.value, meshName)
27+
28+
obName = mesh.blenderName + "_object"
29+
30+
mesh.blenderMesh = bpy.data.meshes.new(mesh.blenderName)
31+
obj = bpy.data.objects.new(obName, mesh.blenderMesh)
32+
33+
scn = bpy.context.scene
34+
scn.objects.link(obj)
35+
scn.objects.active = obj
36+
obj.select = True
37+
38+
mesh.verts = utils.TransposeCoordinateArray(meshNode.search("vertices", False).value)
39+
mesh.faces = utils.TransposeCoordinateArray(meshNode.search("faces", False).value)
40+
mesh.uv_coords = utils.TransposeCoordinateArray2D(meshNode.search("uv_map", False).value)
41+
42+
mesh.blenderMesh.from_pydata(mesh.verts, [], mesh.faces)
43+
44+
bm = bmesh.new()
45+
bm.from_mesh(mesh.blenderMesh)
46+
47+
bm.verts.ensure_lookup_table()
48+
bm.verts.index_update()
49+
bm.faces.index_update()
50+
51+
uv_layer = bm.loops.layers.uv.new(mesh.blenderName + "_uv")
52+
for face in bm.faces:
53+
for loop in face.loops:
54+
loop[uv_layer].uv[0] = mesh.uv_coords[loop.vert.index][0]
55+
loop[uv_layer].uv[1] = 1 - mesh.uv_coords[loop.vert.index][1]
56+
57+
mat = bpy.data.materials.new(name=mesh.blenderName + "Material")
58+
59+
obj.data.materials.append(mat)
60+
61+
tex = bpy.data.textures.new(meshName + "_text", 'IMAGE')
62+
tex.type = 'IMAGE'
63+
64+
imageFile = Path(os.path.join(os.path.dirname(self.filename), meshNode.search("diff", False).value[0]))
65+
66+
altImageFile = Path(os.path.join(os.path.dirname(self.filename), meshName + "_diffuse.dds"))
67+
68+
if imageFile.is_file():
69+
imageFile.resolve()
70+
image = bpy.data.images.load(str(imageFile))
71+
tex.image = image
72+
elif altImageFile.is_file():
73+
altImageFile.resolve()
74+
image = bpy.data.images.load(str(altImageFile))
75+
tex.image = image
76+
else:
77+
print("No Texture File was found.")
78+
79+
slot = mat.texture_slots.add()
80+
slot.texture = tex
81+
slot.bump_method = 'BUMP_ORIGINAL'
82+
slot.mapping = 'FLAT'
83+
slot.mapping_x = 'X'
84+
slot.mapping_y = 'Y'
85+
slot.texture_coords = 'UV'
86+
slot.use = True
87+
slot.uv_layer = uv_layer.name
88+
89+
bm.to_mesh(mesh.blenderMesh)
90+
91+
#Locator Add Block
92+
locatorNode = meshNode.search("locator", False)
93+
94+
locators = locatorNode.subNodes[0].Flatten()
95+
96+
for i in range(0, len(locators)):
97+
o = bpy.data.objects.new(locators[i].name, None)
98+
bpy.context.scene.objects.link(o)
99+
o.empty_draw_size = 2
100+
o.empty_draw_type = 'PLAIN_AXES'
101+
o.location = (locators[i].subNodes[0].value[0], locators[i].subNodes[0].value[1], locators[i].subNodes[0].value[2])
102+
103+
def ReadFile(self):
104+
offset = 0
105+
meshFile = io.open(self.filename, "rb")
106+
rawData = meshFile.read()
107+
108+
# Remove File Identifier
109+
data = rawData.lstrip(b"@@b@")
110+
111+
buffer = utils.BufferReader(data)
112+
113+
rootNode = tree.TreeNode("root")
114+
115+
self.dataTree = tree.Tree(rootNode)
116+
self.ReadObject(rootNode, buffer, -1)
117+
118+
self.dataTree.print()
119+
meshFile.close()
120+
121+
def ReadProperty(self, treeNode: tree.TreeNode, buffer: utils.BufferReader):
122+
name = ""
123+
dataCount = 0
124+
stringType = 1
125+
propertyData = []
126+
127+
nameLength = buffer.NextInt8()
128+
129+
for i in range(1, nameLength + 1):
130+
name += buffer.NextChar()
131+
132+
name = utils.TranslatePropertyName(name)
133+
134+
char = buffer.NextChar()
135+
136+
if char == "i":
137+
dataCount = buffer.NextUInt32()
138+
139+
for i in range(0, dataCount):
140+
propertyData.append(buffer.NextInt32())
141+
elif char == "f":
142+
dataCount = buffer.NextUInt32()
143+
144+
for i in range(0, dataCount):
145+
propertyData.append(buffer.NextFloat32())
146+
elif char == "s":
147+
stringValue = ""
148+
stringType = buffer.NextUInt32()
149+
dataCount = buffer.NextUInt32()
150+
151+
stringValue = self.ReadNullByteString(buffer)
152+
153+
propertyData.append(stringValue)
154+
155+
newNode = tree.TreeNode(name)
156+
newNode.value = propertyData
157+
158+
treeNode.append(newNode)
159+
160+
def ReadObject(self, treeNode: tree.TreeNode, buffer: utils.BufferReader, depth):
161+
objectName = ""
162+
char = buffer.NextChar()
163+
164+
while not buffer.IsEOF() and char == '[':
165+
depth += 1
166+
char = buffer.NextChar()
167+
168+
node = treeNode
169+
170+
if depth >= 0:
171+
objectName = char + self.ReadNullByteString(buffer)
172+
173+
node = tree.TreeNode(objectName)
174+
treeNode.append(node)
175+
176+
while not buffer.IsEOF():
177+
if char == "!":
178+
self.ReadProperty(node, buffer)
179+
elif char == "[":
180+
self.ReadObject(node, buffer, depth + 1)
181+
182+
if not buffer.IsEOF():
183+
char = buffer.NextChar()
184+
185+
def ReadNullByteString(self, buffer: utils.BufferReader):
186+
stringValue = ""
187+
188+
char = buffer.NextChar()
189+
190+
while char != "\x00":
191+
stringValue += char
192+
char = buffer.NextChar()
193+
194+
return stringValue
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class PdxMesh():
2+
def __init__(self, name, blenderName):
3+
self.name = name
4+
self.blenderName = blenderName
5+
self.blenderMesh = None
6+
self.verts = []
7+
self.faces = []
8+
self.tangents = []
9+
self.normals = []
10+
self.locators = []
11+
self.uv_coords = []
12+
self.material = None
13+
14+
class Locator():
15+
def __init__(self, name, pos):
16+
self.name = name
17+
self.pos = pos

import-export-clausewitz/tree.py

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
class TreeNode:
2+
idCounter = 1
3+
4+
def __init__(self, name):
5+
self.name = name
6+
self.subNodes = []
7+
self.value = []
8+
self.id = TreeNode.idCounter
9+
TreeNode.idCounter += 1
10+
11+
def append(self, node):
12+
self.subNodes.append(node)
13+
14+
def print(self, indent):
15+
line = ""
16+
17+
for i in range(0, indent):
18+
line += "-"
19+
20+
line += self.name
21+
print(line)
22+
23+
for i in range(0, len(self.subNodes)):
24+
self.subNodes[i].print(indent + 1)
25+
26+
def search(self, name: str, useSelf: bool):
27+
if self.name == name and useSelf:
28+
return self
29+
else:
30+
if len(self.subNodes) > 0:
31+
for node in self.subNodes:
32+
result = node.search(name, True)
33+
34+
if result != 0:
35+
return result
36+
else:
37+
return 0
38+
39+
return 0
40+
41+
def searchById(self, id: int):
42+
if self.id == id:
43+
return self
44+
else:
45+
if len(self.subNodes) > 0:
46+
for node in self.subNodes:
47+
result = node.searchById(id, True)
48+
49+
if result != 0:
50+
return result
51+
else:
52+
return 0
53+
54+
return 0
55+
56+
def searchForParentNode(self, childNodeId: int):
57+
for i in range(0, len(self.subNodes)):
58+
if self.subNodes[i].id == childNodeId:
59+
return self
60+
61+
newParentNode = self.subNodes[i].searchForParentNode(childNodeId)
62+
63+
if newParentNode != -1:
64+
return newParentNode
65+
66+
67+
return -1
68+
69+
def hasSubNode(self, name: str):
70+
for i in range(0, len(self.subNodes)):
71+
if self.subNodes[i].name == name:
72+
return True
73+
74+
return False
75+
76+
def Flatten(self):
77+
result = []
78+
79+
newNode = TreeNode(self.name)
80+
newNode.append(self.subNodes[0])
81+
newNode.append(self.subNodes[1])
82+
result.append(newNode)
83+
84+
if len(self.subNodes) > 2:
85+
result.extend(self.subNodes[2].Flatten())
86+
87+
return result
88+
89+
class Tree:
90+
def __init__(self, rootNode: TreeNode):
91+
self.rootNode = rootNode
92+
93+
def print(self):
94+
self.rootNode.print(0)
95+
96+
def search(self, name):
97+
return self.rootNode.search(name, True)

0 commit comments

Comments
 (0)