initial collada mesh rendering
This commit is contained in:
parent
9058d453ed
commit
e868d33281
6
Makefile
6
Makefile
@ -46,7 +46,8 @@ SHADERS = \
|
||||
$(BUILD_TYPE)/effect/font.fxo \
|
||||
$(BUILD_TYPE)/effect/volume.fxo \
|
||||
$(BUILD_TYPE)/effect/bloom.fxo \
|
||||
$(BUILD_TYPE)/effect/static.fxo
|
||||
$(BUILD_TYPE)/effect/static.fxo \
|
||||
$(BUILD_TYPE)/effect/collada.fxo
|
||||
|
||||
$(BUILD_TYPE)/%.res: %.rc $(SHADERS)
|
||||
@mkdir -p $(@D)
|
||||
@ -57,13 +58,14 @@ $(BUILD_TYPE)/%.obj: src/%.cpp
|
||||
$(CXX) $(CXXSTD) $(CFLAGS) $(CXXFLAGS) $(WOPT) $(OPT) -o $@ -c $<
|
||||
|
||||
OBJS = \
|
||||
$(BUILD_TYPE)/main.res \
|
||||
$(BUILD_TYPE)/robot_player.obj \
|
||||
$(BUILD_TYPE)/cube.obj \
|
||||
$(BUILD_TYPE)/main.obj \
|
||||
$(BUILD_TYPE)/print.obj \
|
||||
$(BUILD_TYPE)/render_state.obj \
|
||||
$(BUILD_TYPE)/input.obj \
|
||||
$(BUILD_TYPE)/main.res
|
||||
$(BUILD_TYPE)/collada.obj
|
||||
|
||||
$(BUILD_TYPE)/d3d10.exe: $(OBJS)
|
||||
@mkdir -p $(@D)
|
||||
|
||||
580
collada/cube_material.py
Normal file
580
collada/cube_material.py
Normal file
@ -0,0 +1,580 @@
|
||||
collada.types.Collada(
|
||||
library_animations=[],
|
||||
library_controllers=[],
|
||||
library_effects=[
|
||||
collada.types.LibraryEffects(
|
||||
id=None,
|
||||
name=None,
|
||||
effects=[
|
||||
collada.types.Effect(
|
||||
id='CubeMaterialTextured',
|
||||
name=None,
|
||||
profile_common=[
|
||||
collada.types.ProfileCommon(
|
||||
id=None,
|
||||
newparam=[
|
||||
collada.types.Newparam(
|
||||
sid='troll_cleric29_max2010_jpg-surface',
|
||||
parameter_type=collada.types.Surface(
|
||||
type=collada.types.FxSurfaceType._2D,
|
||||
init_from=collada.types.InitFrom(uri='troll_cleric29_max2010_jpg')
|
||||
)
|
||||
),
|
||||
collada.types.Newparam(
|
||||
sid='troll_cleric29_max2010_jpg-sampler',
|
||||
parameter_type=collada.types.Sampler2D(
|
||||
source=collada.types.SourceFX(sid='troll_cleric29_max2010_jpg-surface')
|
||||
)
|
||||
)
|
||||
],
|
||||
technique=collada.types.TechniqueFX(
|
||||
id=None,
|
||||
sid='common',
|
||||
shader=collada.types.Blinn(
|
||||
emission=collada.types.Color(value=(0.0, 0.0, 0.0, 1.0)),
|
||||
ambient=collada.types.Color(
|
||||
value=(0.8588236, 0.254902, 0.9137256, 1.0)
|
||||
),
|
||||
diffuse=collada.types.Texture(
|
||||
texture='troll_cleric29_max2010_jpg-sampler',
|
||||
texcoord='CHANNEL1'
|
||||
),
|
||||
specular=collada.types.Color(value=(0.0, 0.0, 0.0, 1.0)),
|
||||
shininess=collada.types.Float(value=10.0),
|
||||
reflective=collada.types.Color(value=(0.0, 0.0, 0.0, 1.0)),
|
||||
reflectivity=None,
|
||||
transparent=collada.types.Color(value=(1.0, 1.0, 1.0, 1.0)),
|
||||
transparency=collada.types.Float(value=1.0),
|
||||
index_of_refraction=None
|
||||
)
|
||||
)
|
||||
)
|
||||
]
|
||||
)
|
||||
]
|
||||
)
|
||||
],
|
||||
library_materials=[
|
||||
collada.types.LibraryMaterials(
|
||||
id=None,
|
||||
name=None,
|
||||
materials=[
|
||||
collada.types.Material(
|
||||
id='CubeMaterialTextured-material',
|
||||
name='CubeMaterialTextured',
|
||||
instance_effect=collada.types.InstanceEffect(
|
||||
sid=None,
|
||||
name=None,
|
||||
url='#CubeMaterialTextured'
|
||||
)
|
||||
)
|
||||
]
|
||||
)
|
||||
],
|
||||
library_geometries=[
|
||||
collada.types.LibraryGeometries(
|
||||
id=None,
|
||||
name=None,
|
||||
geometries=[
|
||||
collada.types.Geometry(
|
||||
id='geom-Cube',
|
||||
name='Cube',
|
||||
geometric_element=collada.types.Mesh(
|
||||
sources=[
|
||||
collada.types.SourceCore(
|
||||
id='geom-Cube-positions',
|
||||
name=None,
|
||||
array_element=collada.types.FloatArray(
|
||||
count=24,
|
||||
id='geom-Cube-positions-array',
|
||||
name=None,
|
||||
digits=6,
|
||||
magnitude=38,
|
||||
floats=[
|
||||
-0.5,
|
||||
-0.5,
|
||||
0.0,
|
||||
0.5,
|
||||
-0.5,
|
||||
0.0,
|
||||
-0.5,
|
||||
0.5,
|
||||
0.0,
|
||||
0.5,
|
||||
0.5,
|
||||
0.0,
|
||||
-0.5,
|
||||
-0.5,
|
||||
1.0,
|
||||
0.5,
|
||||
-0.5,
|
||||
1.0,
|
||||
-0.5,
|
||||
0.5,
|
||||
1.0,
|
||||
0.5,
|
||||
0.5,
|
||||
1.0
|
||||
]
|
||||
),
|
||||
technique_common=collada.types.TechniqueCommon_SourceCore(
|
||||
accessor=collada.types.Accessor(
|
||||
count=8,
|
||||
offset=0,
|
||||
source='#geom-Cube-positions-array',
|
||||
stride=3,
|
||||
params=[
|
||||
collada.types.Param(name='X', sid=None, type='float', semantic=None),
|
||||
collada.types.Param(name='Y', sid=None, type='float', semantic=None),
|
||||
collada.types.Param(name='Z', sid=None, type='float', semantic=None)
|
||||
]
|
||||
)
|
||||
)
|
||||
),
|
||||
collada.types.SourceCore(
|
||||
id='geom-Cube-normals',
|
||||
name=None,
|
||||
array_element=collada.types.FloatArray(
|
||||
count=72,
|
||||
id='geom-Cube-normals-array',
|
||||
name=None,
|
||||
digits=6,
|
||||
magnitude=38,
|
||||
floats=[
|
||||
0.0,
|
||||
0.0,
|
||||
-1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
-1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
-1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
-1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
1.0,
|
||||
0.0,
|
||||
-1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
-1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
-1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
-1.0,
|
||||
0.0,
|
||||
1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
1.0,
|
||||
0.0,
|
||||
-1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
-1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
-1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
-1.0,
|
||||
0.0,
|
||||
0.0
|
||||
]
|
||||
),
|
||||
technique_common=collada.types.TechniqueCommon_SourceCore(
|
||||
accessor=collada.types.Accessor(
|
||||
count=24,
|
||||
offset=0,
|
||||
source='#geom-Cube-normals-array',
|
||||
stride=3,
|
||||
params=[
|
||||
collada.types.Param(name='X', sid=None, type='float', semantic=None),
|
||||
collada.types.Param(name='Y', sid=None, type='float', semantic=None),
|
||||
collada.types.Param(name='Z', sid=None, type='float', semantic=None)
|
||||
]
|
||||
)
|
||||
)
|
||||
),
|
||||
collada.types.SourceCore(
|
||||
id='geom-Cube-map1',
|
||||
name=None,
|
||||
array_element=collada.types.FloatArray(
|
||||
count=36,
|
||||
id='geom-Cube-map1-array',
|
||||
name=None,
|
||||
digits=6,
|
||||
magnitude=38,
|
||||
floats=[
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
1.0,
|
||||
0.0,
|
||||
1.0,
|
||||
1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
1.0,
|
||||
0.0,
|
||||
1.0,
|
||||
1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
1.0,
|
||||
0.0,
|
||||
0.0,
|
||||
0.0,
|
||||
1.0,
|
||||
0.0,
|
||||
1.0,
|
||||
1.0,
|
||||
0.0
|
||||
]
|
||||
),
|
||||
technique_common=collada.types.TechniqueCommon_SourceCore(
|
||||
accessor=collada.types.Accessor(
|
||||
count=12,
|
||||
offset=0,
|
||||
source='#geom-Cube-map1-array',
|
||||
stride=3,
|
||||
params=[
|
||||
collada.types.Param(name='S', sid=None, type='float', semantic=None),
|
||||
collada.types.Param(name='T', sid=None, type='float', semantic=None),
|
||||
collada.types.Param(name='P', sid=None, type='float', semantic=None)
|
||||
]
|
||||
)
|
||||
)
|
||||
)
|
||||
],
|
||||
vertices=collada.types.Vertices(
|
||||
id='geom-Cube-vertices',
|
||||
name=None,
|
||||
inputs=[
|
||||
collada.types.InputUnshared(
|
||||
semantic='POSITION',
|
||||
source='#geom-Cube-positions'
|
||||
)
|
||||
]
|
||||
),
|
||||
primitive_elements=[
|
||||
collada.types.Triangles(
|
||||
name=None,
|
||||
count=12,
|
||||
material='CubeMaterialTextured',
|
||||
inputs=[
|
||||
collada.types.InputShared(
|
||||
offset=0,
|
||||
semantic='VERTEX',
|
||||
source='#geom-Cube-vertices',
|
||||
set=None
|
||||
),
|
||||
collada.types.InputShared(
|
||||
offset=1,
|
||||
semantic='NORMAL',
|
||||
source='#geom-Cube-normals',
|
||||
set=None
|
||||
),
|
||||
collada.types.InputShared(
|
||||
offset=2,
|
||||
semantic='TEXCOORD',
|
||||
source='#geom-Cube-map1',
|
||||
set=0
|
||||
)
|
||||
],
|
||||
p=[
|
||||
0,
|
||||
0,
|
||||
9,
|
||||
2,
|
||||
1,
|
||||
11,
|
||||
3,
|
||||
2,
|
||||
10,
|
||||
3,
|
||||
2,
|
||||
10,
|
||||
1,
|
||||
3,
|
||||
8,
|
||||
0,
|
||||
0,
|
||||
9,
|
||||
4,
|
||||
4,
|
||||
8,
|
||||
5,
|
||||
5,
|
||||
9,
|
||||
7,
|
||||
6,
|
||||
11,
|
||||
7,
|
||||
6,
|
||||
11,
|
||||
6,
|
||||
7,
|
||||
10,
|
||||
4,
|
||||
4,
|
||||
8,
|
||||
0,
|
||||
8,
|
||||
4,
|
||||
1,
|
||||
9,
|
||||
5,
|
||||
5,
|
||||
10,
|
||||
7,
|
||||
5,
|
||||
10,
|
||||
7,
|
||||
4,
|
||||
11,
|
||||
6,
|
||||
0,
|
||||
8,
|
||||
4,
|
||||
1,
|
||||
12,
|
||||
0,
|
||||
3,
|
||||
13,
|
||||
1,
|
||||
7,
|
||||
14,
|
||||
3,
|
||||
7,
|
||||
14,
|
||||
3,
|
||||
5,
|
||||
15,
|
||||
2,
|
||||
1,
|
||||
12,
|
||||
0,
|
||||
3,
|
||||
16,
|
||||
4,
|
||||
2,
|
||||
17,
|
||||
5,
|
||||
6,
|
||||
18,
|
||||
7,
|
||||
6,
|
||||
18,
|
||||
7,
|
||||
7,
|
||||
19,
|
||||
6,
|
||||
3,
|
||||
16,
|
||||
4,
|
||||
2,
|
||||
20,
|
||||
0,
|
||||
0,
|
||||
21,
|
||||
1,
|
||||
4,
|
||||
22,
|
||||
3,
|
||||
4,
|
||||
22,
|
||||
3,
|
||||
6,
|
||||
23,
|
||||
2,
|
||||
2,
|
||||
20,
|
||||
0
|
||||
]
|
||||
)
|
||||
]
|
||||
)
|
||||
)
|
||||
]
|
||||
)
|
||||
],
|
||||
library_lights=[
|
||||
collada.types.LibraryLights(
|
||||
id=None,
|
||||
name=None,
|
||||
lights=[
|
||||
collada.types.Light(
|
||||
id='EnvironmentAmbientLight',
|
||||
name='EnvironmentAmbientLight',
|
||||
technique_common=collada.types.TechniqueCommon_Light(
|
||||
light=collada.types.Ambient(color=(0.0, 0.0, 0.0))
|
||||
)
|
||||
)
|
||||
]
|
||||
)
|
||||
],
|
||||
library_images=[
|
||||
collada.types.LibraryImages(
|
||||
id=None,
|
||||
name=None,
|
||||
images=[
|
||||
collada.types.Image(
|
||||
id='troll_cleric29_max2010_jpg',
|
||||
name=None,
|
||||
format=None,
|
||||
height=None,
|
||||
width=None,
|
||||
depth=None,
|
||||
image_source=collada.types.InitFrom(
|
||||
uri='file:///C:/cygwin/home/bilbo/collada/images/0_troll_cleric29_max2010.'
|
||||
'jpg'
|
||||
)
|
||||
)
|
||||
]
|
||||
)
|
||||
],
|
||||
library_visual_scenes=[
|
||||
collada.types.LibraryVisualScenes(
|
||||
id=None,
|
||||
name=None,
|
||||
visual_scenes=[
|
||||
collada.types.VisualScene(
|
||||
id='MaxScene',
|
||||
name=None,
|
||||
nodes=[
|
||||
collada.types.Node(
|
||||
id=None,
|
||||
name='EnvironmentAmbientLight',
|
||||
sid=None,
|
||||
type=collada.types.NodeType.NODE,
|
||||
layer=[],
|
||||
transformation_elements=[],
|
||||
instance_geometries=[],
|
||||
instance_lights=[
|
||||
collada.types.InstanceLight(
|
||||
sid=None,
|
||||
name=None,
|
||||
url='#EnvironmentAmbientLight'
|
||||
)
|
||||
],
|
||||
nodes=[]
|
||||
),
|
||||
collada.types.Node(
|
||||
id='node-Cube',
|
||||
name='Cube',
|
||||
sid=None,
|
||||
type=collada.types.NodeType.NODE,
|
||||
layer=[],
|
||||
transformation_elements=[],
|
||||
instance_geometries=[],
|
||||
instance_lights=[],
|
||||
nodes=[
|
||||
collada.types.Node(
|
||||
id=None,
|
||||
name=None,
|
||||
sid=None,
|
||||
type=collada.types.NodeType.NODE,
|
||||
layer=[],
|
||||
transformation_elements=[
|
||||
collada.types.Matrix(
|
||||
sid=None,
|
||||
values=(
|
||||
(1.0, 0.0, 0.0, 0.0),
|
||||
(0.0, 1.0, -4.37114e-08, 2.18557e-08),
|
||||
(0.0, 4.37114e-08, 1.0, -0.5),
|
||||
(0.0, 0.0, 0.0, 1.0)
|
||||
)
|
||||
)
|
||||
],
|
||||
instance_geometries=[
|
||||
collada.types.InstanceGeometry(
|
||||
sid=None,
|
||||
name=None,
|
||||
url='#geom-Cube',
|
||||
bind_material=collada.types.BindMaterial(
|
||||
technique_common=collada.types.TechniqueCommon_BindMaterial(
|
||||
materials=[
|
||||
collada.types.InstanceMaterial(
|
||||
sid=None,
|
||||
name=None,
|
||||
target='#CubeMaterialTextured-material',
|
||||
symbol='CubeMaterialTextured',
|
||||
bind_vertex_inputs=[
|
||||
collada.types.BindVertexInput(
|
||||
semantic='CHANNEL1',
|
||||
input_semantic='TEXCOORD',
|
||||
input_set='0'
|
||||
)
|
||||
]
|
||||
)
|
||||
]
|
||||
)
|
||||
)
|
||||
)
|
||||
],
|
||||
instance_lights=[],
|
||||
nodes=[]
|
||||
)
|
||||
]
|
||||
)
|
||||
]
|
||||
)
|
||||
]
|
||||
)
|
||||
],
|
||||
scenes=[
|
||||
collada.types.Scene(
|
||||
instance_visual_scene=collada.types.InstanceVisualScene(
|
||||
sid=None,
|
||||
name=None,
|
||||
url='#MaxScene'
|
||||
)
|
||||
)
|
||||
]
|
||||
)
|
||||
95
collada/mesh.py
Normal file
95
collada/mesh.py
Normal file
@ -0,0 +1,95 @@
|
||||
from collections import defaultdict
|
||||
from itertools import chain, islice
|
||||
|
||||
from collada import parse
|
||||
from collada import types
|
||||
|
||||
from prettyprinter import pprint, install_extras
|
||||
install_extras(include=["dataclasses"])
|
||||
|
||||
def resolve_input_source(collada, source_uri):
|
||||
return element
|
||||
|
||||
def find_semantics(inputs, semantic):
|
||||
return [i for i in inputs if i.semantic == semantic]
|
||||
|
||||
def mesh_vertex_buffer(collada, mesh):
|
||||
semantic_names = ["NORMAL", "TEXCOORD"]
|
||||
|
||||
assert len(mesh.primitive_elements) == 1
|
||||
triangles, = mesh.primitive_elements
|
||||
assert type(triangles) is types.Triangles
|
||||
|
||||
vertex_input, = find_semantics(triangles.inputs, "VERTEX")
|
||||
vertices = collada.lookup(vertex_input.source, types.Vertices)
|
||||
position_input, = find_semantics(vertices.inputs, "POSITION")
|
||||
position_source = collada.lookup(position_input.source, types.SourceCore)
|
||||
assert type(position_source.array_element) is types.FloatArray
|
||||
|
||||
by_offset = defaultdict(list)
|
||||
by_offset[vertex_input.offset].append((vertex_input, position_source))
|
||||
|
||||
for semantic_name in semantic_names:
|
||||
for input in find_semantics(triangles.inputs, semantic_name):
|
||||
source = collada.lookup(input.source, types.SourceCore)
|
||||
assert type(source.array_element) is types.FloatArray
|
||||
by_offset[input.offset].append((input, source))
|
||||
|
||||
max_offset = max(i.offset for i in triangles.inputs)
|
||||
p_stride = max_offset + 1
|
||||
assert len(triangles.p) == triangles.count * 3 * p_stride
|
||||
|
||||
######################################################################
|
||||
# generate the index/vertex buffer
|
||||
######################################################################
|
||||
vertex_buffer_stride = sum(
|
||||
source.technique_common.accessor.stride
|
||||
for input, source in chain.from_iterable(by_offset.values())
|
||||
)
|
||||
index_table = {}
|
||||
next_output_index = 0
|
||||
index_buffer = []
|
||||
vertex_buffer = []
|
||||
|
||||
used_offsets = [offset for offset in range(p_stride) if offset in by_offset]
|
||||
|
||||
for vertex_ix in range(triangles.count * 3):
|
||||
index_table_key = tuple(triangles.p[vertex_ix * p_stride + offset] for offset in used_offsets)
|
||||
print(index_table_key)
|
||||
if index_table_key in index_table:
|
||||
index_buffer.append(index_table[index_table_key])
|
||||
continue
|
||||
|
||||
index_table[index_table_key] = next_output_index
|
||||
index_buffer.append(next_output_index)
|
||||
next_output_index += 1
|
||||
|
||||
# emit vertex attributes for new output index in vertex buffer
|
||||
for offset in used_offsets:
|
||||
p_index = triangles.p[vertex_ix * p_stride + offset]
|
||||
for input, source in by_offset[offset]:
|
||||
print(input.semantic, end=" ")
|
||||
source_stride = source.technique_common.accessor.stride
|
||||
source_index = p_index * source_stride
|
||||
array_slice = source.array_element.floats[source_index:source_index+source_stride]
|
||||
print(array_slice, end=" ")
|
||||
vertex_buffer.extend(array_slice)
|
||||
print()
|
||||
|
||||
print("{")
|
||||
for i in range(triangles.count):
|
||||
print(", ".join(str(index_buffer[i * 3 + j]) for j in range(3)), end=",\n")
|
||||
print("}")
|
||||
print("{")
|
||||
for i in range(len(index_table)):
|
||||
print(", ".join(str(vertex_buffer[i * vertex_buffer_stride + j])
|
||||
for j in range(vertex_buffer_stride)), end=",\n")
|
||||
print("}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
import sys
|
||||
collada = parse.parse_collada_file(sys.argv[1])
|
||||
|
||||
mesh = collada.library_geometries[0].geometries[0].geometric_element
|
||||
assert type(mesh) is types.Mesh
|
||||
mesh_vertex_buffer(collada, mesh)
|
||||
@ -348,7 +348,7 @@ class Vertices:
|
||||
id: ID
|
||||
name: Optional[str]
|
||||
|
||||
input: List[InputUnshared] # 1 or more
|
||||
inputs: List[InputUnshared] # 1 or more
|
||||
|
||||
@dataclass
|
||||
class Mesh:
|
||||
@ -534,8 +534,10 @@ class Collada:
|
||||
self.scenes = []
|
||||
self._lookup = None
|
||||
|
||||
def lookup(self, s):
|
||||
def lookup(self, s, t):
|
||||
assert '/' not in s
|
||||
assert s.startswith("#")
|
||||
id = s[1:]
|
||||
return self._lookup[id]
|
||||
value = self._lookup[id]
|
||||
assert type(value) is t, type(value)
|
||||
return value
|
||||
|
||||
12
include/collada.hpp
Normal file
12
include/collada.hpp
Normal file
@ -0,0 +1,12 @@
|
||||
#pragma once
|
||||
|
||||
#ifndef COLLADA_HPP_
|
||||
#define COLLADA_HPP_
|
||||
|
||||
namespace collada {
|
||||
HRESULT LoadEffect();
|
||||
HRESULT LoadMesh();
|
||||
void Render();
|
||||
}
|
||||
|
||||
#endif
|
||||
2
main.rc
2
main.rc
@ -6,3 +6,5 @@ RES_STATIC_FXO RCDATA "static.fxo"
|
||||
RES_PERLIN RCDATA "texture/perlin.data"
|
||||
RES_ROBOT_PLAYER RCDATA "models/robot_player/robot_player.data"
|
||||
RES_FONT_TERMINUS_6X12 RCDATA "font/terminus_128x64_6x12.data"
|
||||
|
||||
RES_COLLADA_FXO RCDATA "collada.fxo"
|
||||
265
models/skinned_cube/skinned_cube.DAE
Executable file
265
models/skinned_cube/skinned_cube.DAE
Executable file
@ -0,0 +1,265 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
|
||||
<asset>
|
||||
<contributor>
|
||||
<author>bilbo</author>
|
||||
<authoring_tool>OpenCOLLADA for 3ds Max; Version: 1.6; Revision: 68</authoring_tool>
|
||||
<source_data>file:///C:/cygwin/home/bilbo/d3d10/models/skinned_cube/skinned_cube.max</source_data>
|
||||
</contributor>
|
||||
<created>2026-01-23T23:56:13</created>
|
||||
<modified>2026-01-23T23:56:13</modified>
|
||||
<unit name="inch" meter="0.0254"/>
|
||||
<up_axis>Z_UP</up_axis>
|
||||
</asset>
|
||||
<library_effects>
|
||||
<effect id="ColorEffectR26G177B26">
|
||||
<profile_COMMON>
|
||||
<technique sid="common">
|
||||
<phong>
|
||||
<ambient>
|
||||
<color>0.1019608 0.6941176 0.1019608 1</color>
|
||||
</ambient>
|
||||
<diffuse>
|
||||
<color>0.1019608 0.6941176 0.1019608 1</color>
|
||||
</diffuse>
|
||||
<specular>
|
||||
<color>1 1 1 1</color>
|
||||
</specular>
|
||||
<shininess>
|
||||
<float>10</float>
|
||||
</shininess>
|
||||
<reflective>
|
||||
<color>0 0 0 1</color>
|
||||
</reflective>
|
||||
<transparent>
|
||||
<color>1 1 1 1</color>
|
||||
</transparent>
|
||||
<transparency>
|
||||
<float>1</float>
|
||||
</transparency>
|
||||
</phong>
|
||||
</technique>
|
||||
</profile_COMMON>
|
||||
</effect>
|
||||
</library_effects>
|
||||
<library_materials>
|
||||
<material id="ColorEffectR26G177B26-material" name="ColorEffectR26G177B26-material">
|
||||
<instance_effect url="#ColorEffectR26G177B26"/>
|
||||
</material>
|
||||
</library_materials>
|
||||
<library_geometries>
|
||||
<geometry id="geom-Box001" name="Box001">
|
||||
<mesh>
|
||||
<source id="geom-Box001-positions">
|
||||
<float_array id="geom-Box001-positions-array" count="72">-5 -5 0 5 -5 0 -5 5 0 5 5 0 -5 -5 20 5 -5 20 -5 5 20 5 5 20 -5 -5 4 5 -5 4 5 5 4 -5 5 4 -5 -5 8 5 -5 8 5 5 8 -5 5 8 -5 -5 12 5 -5 12 5 5 12 -5 5 12 -5 -5 16 5 -5 16 5 5 16 -5 5 16</float_array>
|
||||
<technique_common>
|
||||
<accessor source="#geom-Box001-positions-array" count="24" stride="3">
|
||||
<param name="X" type="float"/>
|
||||
<param name="Y" type="float"/>
|
||||
<param name="Z" type="float"/>
|
||||
</accessor>
|
||||
</technique_common>
|
||||
</source>
|
||||
<source id="geom-Box001-normals">
|
||||
<float_array id="geom-Box001-normals-array" count="168">0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 1 0 0 1 0 0 1 0 0 1 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0 -1 0 0</float_array>
|
||||
<technique_common>
|
||||
<accessor source="#geom-Box001-normals-array" count="56" stride="3">
|
||||
<param name="X" type="float"/>
|
||||
<param name="Y" type="float"/>
|
||||
<param name="Z" type="float"/>
|
||||
</accessor>
|
||||
</technique_common>
|
||||
</source>
|
||||
<source id="geom-Box001-map1">
|
||||
<float_array id="geom-Box001-map1-array" count="84">0 0 0 1 0 0 0 0.2 0 1 0.2 0 0 0.4 0 1 0.4 0 0 0.6 0 1 0.6 0 0 0.8 0 1 0.8 0 0 1 0 1 1 0 0 0 0 1 0 0 0 0.2 0 1 0.2 0 0 0.4 0 1 0.4 0 0 0.6 0 1 0.6 0 0 0.8 0 1 0.8 0 0 1 0 1 1 0 0 0 0 1 0 0 0 1 0 1 1 0</float_array>
|
||||
<technique_common>
|
||||
<accessor source="#geom-Box001-map1-array" count="28" stride="3">
|
||||
<param name="S" type="float"/>
|
||||
<param name="T" type="float"/>
|
||||
<param name="P" type="float"/>
|
||||
</accessor>
|
||||
</technique_common>
|
||||
</source>
|
||||
<vertices id="geom-Box001-vertices">
|
||||
<input semantic="POSITION" source="#geom-Box001-positions"/>
|
||||
</vertices>
|
||||
<triangles material="ColorMaterial" count="44">
|
||||
<input semantic="VERTEX" source="#geom-Box001-vertices" offset="0"/>
|
||||
<input semantic="NORMAL" source="#geom-Box001-normals" offset="1"/>
|
||||
<input semantic="TEXCOORD" source="#geom-Box001-map1" offset="2" set="0"/>
|
||||
<p>0 0 25 2 1 27 3 2 26 3 2 26 1 3 24 0 0 25 4 4 24 5 5 25 7 6 27 7 6 27 6 7 26 4 4 24 0 8 12 1 9 13 9 10 15 9 10 15 8 11 14 0 8 12 8 11 14 9 10 15 13 12 17 13 12 17 12 13 16 8 11 14 12 13 16 13 12 17 17 14 19 17 14 19 16 15 18 12 13 16 16 15 18 17 14 19 21 16 21 21 16 21 20 17 20 16 15 18 20 17 20 21 16 21 5 18 23 5 18 23 4 19 22 20 17 20 1 20 0 3 21 1 10 22 3 10 22 3 9 23 2 1 20 0 9 23 2 10 22 3 14 24 5 14 24 5 13 25 4 9 23 2 13 25 4 14 24 5 18 26 7 18 26 7 17 27 6 13 25 4 17 27 6 18 26 7 22 28 9 22 28 9 21 29 8 17 27 6 21 29 8 22 28 9 7 30 11 7 30 11 5 31 10 21 29 8 3 32 12 2 33 13 11 34 15 11 34 15 10 35 14 3 32 12 10 35 14 11 34 15 15 36 17 15 36 17 14 37 16 10 35 14 14 37 16 15 36 17 19 38 19 19 38 19 18 39 18 14 37 16 18 39 18 19 38 19 23 40 21 23 40 21 22 41 20 18 39 18 22 41 20 23 40 21 6 42 23 6 42 23 7 43 22 22 41 20 2 44 0 0 45 1 8 46 3 8 46 3 11 47 2 2 44 0 11 47 2 8 46 3 12 48 5 12 48 5 15 49 4 11 47 2 15 49 4 12 48 5 16 50 7 16 50 7 19 51 6 15 49 4 19 51 6 16 50 7 20 52 9 20 52 9 23 53 8 19 51 6 23 53 8 20 52 9 4 54 11 4 54 11 6 55 10 23 53 8</p>
|
||||
</triangles>
|
||||
</mesh>
|
||||
<extra>
|
||||
<technique profile="OpenCOLLADA3dsMax">
|
||||
<max_box>
|
||||
<length sid="length" type="float">10</length>
|
||||
<width sid="width" type="float">10</width>
|
||||
<height sid="height" type="float">20</height>
|
||||
<widthsegments sid="widthsegments" type="int">1</widthsegments>
|
||||
<lengthsegments sid="lengthsegments" type="int">1</lengthsegments>
|
||||
<heightsegments sid="heightsegments" type="int">5</heightsegments>
|
||||
<generateuvs sid="generateuvs" type="int">1</generateuvs>
|
||||
</max_box>
|
||||
</technique>
|
||||
</extra>
|
||||
</geometry>
|
||||
</library_geometries>
|
||||
<library_controllers>
|
||||
<controller id="geom-Box001-skin1">
|
||||
<skin source="#geom-Box001">
|
||||
<bind_shape_matrix>1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1</bind_shape_matrix>
|
||||
<source id="geom-Box001-skin1-joints">
|
||||
<Name_array id="geom-Box001-skin1-joints-array" count="2">joint0 joint1</Name_array>
|
||||
<technique_common>
|
||||
<accessor source="#geom-Box001-skin1-joints-array" count="2" stride="1">
|
||||
<param name="JOINT" type="name"/>
|
||||
</accessor>
|
||||
</technique_common>
|
||||
</source>
|
||||
<source id="geom-Box001-skin1-bind_poses">
|
||||
<float_array id="geom-Box001-skin1-bind_poses-array" count="32">-5.11435e-14 3.13916e-7 1 0 -1.74846e-7 1 -3.13916e-7 0 -1 -1.74846e-7 3.74342e-15 0 0 0 0 1 -8.74227e-8 -5.52335e-7 1 -10 -8.74228e-8 1 5.52335e-7 -9.85461e-6 -1 -8.74227e-8 -8.74227e-8 8.74227e-7 0 0 0 1</float_array>
|
||||
<technique_common>
|
||||
<accessor source="#geom-Box001-skin1-bind_poses-array" count="2" stride="16">
|
||||
<param name="TRANSFORM" type="float4x4"/>
|
||||
</accessor>
|
||||
</technique_common>
|
||||
</source>
|
||||
<source id="geom-Box001-skin1-weights">
|
||||
<float_array id="geom-Box001-skin1-weights-array" count="41">1 0 0 0 0 0 0 0 0 0.2 0.8 0.2 0.8 0.2 0.8 0.2 0.8 0.4 0.6 0.4 0.6 0.4 0.6 0.4 0.6 0.6 0.4 0.6 0.4 0.6 0.4 0.6 0.4 0.8 0.2 0.8 0.2 0.8 0.2 0.8 0.2</float_array>
|
||||
<technique_common>
|
||||
<accessor source="#geom-Box001-skin1-weights-array" count="41" stride="1">
|
||||
<param name="WEIGHT" type="float"/>
|
||||
</accessor>
|
||||
</technique_common>
|
||||
</source>
|
||||
<joints>
|
||||
<input semantic="JOINT" source="#geom-Box001-skin1-joints"/>
|
||||
<input semantic="INV_BIND_MATRIX" source="#geom-Box001-skin1-bind_poses"/>
|
||||
</joints>
|
||||
<vertex_weights count="24">
|
||||
<input semantic="JOINT" source="#geom-Box001-skin1-joints" offset="0"/>
|
||||
<input semantic="WEIGHT" source="#geom-Box001-skin1-weights" offset="1"/>
|
||||
<vcount>2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2</vcount>
|
||||
<v>1 1 0 0 1 2 0 0 1 3 0 0 1 4 0 0 1 0 0 5 1 0 0 6 1 0 0 7 1 0 0 8 1 9 0 10 1 11 0 12 1 13 0 14 1 15 0 16 1 17 0 18 1 19 0 20 1 21 0 22 1 23 0 24 1 25 0 26 1 27 0 28 1 29 0 30 1 31 0 32 1 33 0 34 1 35 0 36 1 37 0 38 1 39 0 40</v>
|
||||
</vertex_weights>
|
||||
</skin>
|
||||
</controller>
|
||||
</library_controllers>
|
||||
<library_lights>
|
||||
<light id="EnvironmentAmbientLight" name="EnvironmentAmbientLight">
|
||||
<technique_common>
|
||||
<ambient>
|
||||
<color>0 0 0</color>
|
||||
</ambient>
|
||||
</technique_common>
|
||||
</light>
|
||||
</library_lights>
|
||||
<library_visual_scenes>
|
||||
<visual_scene id="MaxScene">
|
||||
<node name="EnvironmentAmbientLight">
|
||||
<instance_light url="#EnvironmentAmbientLight"/>
|
||||
</node>
|
||||
<node id="node-Box001" name="Box001">
|
||||
<instance_controller url="#geom-Box001-skin1">
|
||||
<skeleton>#node-Bone001</skeleton>
|
||||
<bind_material>
|
||||
<technique_common>
|
||||
<instance_material symbol="ColorMaterial" target="#ColorEffectR26G177B26-material"/>
|
||||
</technique_common>
|
||||
</bind_material>
|
||||
</instance_controller>
|
||||
<extra>
|
||||
<technique profile="OpenCOLLADA">
|
||||
<cast_shadows sid="cast_shadows" type="bool">1</cast_shadows>
|
||||
<receive_shadows sid="receive_shadows" type="bool">1</receive_shadows>
|
||||
<primary_visibility sid="primary_visibility" type="int">1</primary_visibility>
|
||||
<secondary_visibility sid="secondary_visibility" type="int">1</secondary_visibility>
|
||||
</technique>
|
||||
</extra>
|
||||
</node>
|
||||
<node id="node-Bone001" name="Bone001" sid="joint0" type="JOINT">
|
||||
<rotate>1.32123e-6 1 -1.49608e-6 -90</rotate>
|
||||
<node id="node-Bone002" name="Bone002" sid="joint1" type="JOINT">
|
||||
<translate>10 1.19209e-6 5.69993e-14</translate>
|
||||
<rotate sid="rotationZ">0 0 1 5.00896e-6</rotate>
|
||||
<rotate sid="rotationY">0 1 0 -5.00896e-6</rotate>
|
||||
<rotate sid="rotationX">1 0 0 -5.00896e-6</rotate>
|
||||
<extra>
|
||||
<technique profile="OpenCOLLADA">
|
||||
<cast_shadows sid="cast_shadows" type="bool">1</cast_shadows>
|
||||
<receive_shadows sid="receive_shadows" type="bool">1</receive_shadows>
|
||||
<primary_visibility sid="primary_visibility" type="int">1</primary_visibility>
|
||||
<secondary_visibility sid="secondary_visibility" type="int">1</secondary_visibility>
|
||||
</technique>
|
||||
</extra>
|
||||
</node>
|
||||
<extra>
|
||||
<technique profile="OpenCOLLADA">
|
||||
<cast_shadows sid="cast_shadows" type="bool">1</cast_shadows>
|
||||
<receive_shadows sid="receive_shadows" type="bool">1</receive_shadows>
|
||||
<primary_visibility sid="primary_visibility" type="int">1</primary_visibility>
|
||||
<secondary_visibility sid="secondary_visibility" type="int">1</secondary_visibility>
|
||||
</technique>
|
||||
</extra>
|
||||
</node>
|
||||
</visual_scene>
|
||||
</library_visual_scenes>
|
||||
<library_animations>
|
||||
<animation>
|
||||
<source id="node-Bone002_rotationZ.ANGLE-input">
|
||||
<float_array id="node-Bone002_rotationZ.ANGLE-input-array" count="5">0 0.3333333 0.6666667 1 1.333333</float_array>
|
||||
<technique_common>
|
||||
<accessor source="#node-Bone002_rotationZ.ANGLE-input-array" count="5" stride="1">
|
||||
<param name="TIME" type="float"/>
|
||||
</accessor>
|
||||
</technique_common>
|
||||
</source>
|
||||
<source id="node-Bone002_rotationZ.ANGLE-output">
|
||||
<float_array id="node-Bone002_rotationZ.ANGLE-output-array" count="5">180 230 180 130 180</float_array>
|
||||
<technique_common>
|
||||
<accessor source="#node-Bone002_rotationZ.ANGLE-output-array" count="5" stride="1">
|
||||
<param name="ANGLE" type="float"/>
|
||||
</accessor>
|
||||
</technique_common>
|
||||
</source>
|
||||
<source id="node-Bone002_rotationZ.ANGLE-intangent">
|
||||
<float_array id="node-Bone002_rotationZ.ANGLE-intangent-array" count="10">-0.3332639 180 0.2222222 213.3333 0.5555556 196.6667 0.8888889 146.6667 1.222222 163.3333</float_array>
|
||||
<technique_common>
|
||||
<accessor source="#node-Bone002_rotationZ.ANGLE-intangent-array" count="5" stride="2">
|
||||
<param name="X" type="float"/>
|
||||
<param name="Y" type="float"/>
|
||||
</accessor>
|
||||
</technique_common>
|
||||
</source>
|
||||
<source id="node-Bone002_rotationZ.ANGLE-outtangent">
|
||||
<float_array id="node-Bone002_rotationZ.ANGLE-outtangent-array" count="10">0.1111111 196.6667 0.4444444 213.3333 0.7777778 163.3333 1.111111 146.6667 1.666597 180</float_array>
|
||||
<technique_common>
|
||||
<accessor source="#node-Bone002_rotationZ.ANGLE-outtangent-array" count="5" stride="2">
|
||||
<param name="X" type="float"/>
|
||||
<param name="Y" type="float"/>
|
||||
</accessor>
|
||||
</technique_common>
|
||||
</source>
|
||||
<source id="node-Bone002_rotationZ.ANGLE-interpolation">
|
||||
<Name_array id="node-Bone002_rotationZ.ANGLE-interpolation-array" count="5">LINEAR LINEAR LINEAR LINEAR LINEAR</Name_array>
|
||||
<technique_common>
|
||||
<accessor source="#node-Bone002_rotationZ.ANGLE-interpolation-array" count="5" stride="1">
|
||||
<param name="INTERPOLATION" type="name"/>
|
||||
</accessor>
|
||||
</technique_common>
|
||||
</source>
|
||||
<sampler id="node-Bone002_rotationZ.ANGLE-sampler">
|
||||
<input semantic="INPUT" source="#node-Bone002_rotationZ.ANGLE-input"/>
|
||||
<input semantic="OUTPUT" source="#node-Bone002_rotationZ.ANGLE-output"/>
|
||||
<input semantic="IN_TANGENT" source="#node-Bone002_rotationZ.ANGLE-intangent"/>
|
||||
<input semantic="OUT_TANGENT" source="#node-Bone002_rotationZ.ANGLE-outtangent"/>
|
||||
<input semantic="INTERPOLATION" source="#node-Bone002_rotationZ.ANGLE-interpolation"/>
|
||||
</sampler>
|
||||
<channel source="#node-Bone002_rotationZ.ANGLE-sampler" target="node-Bone002/rotationZ.ANGLE"/>
|
||||
</animation>
|
||||
</library_animations>
|
||||
<scene>
|
||||
<instance_visual_scene url="#MaxScene"/>
|
||||
</scene>
|
||||
</COLLADA>
|
||||
BIN
models/skinned_cube/skinned_cube.max
Executable file
BIN
models/skinned_cube/skinned_cube.max
Executable file
Binary file not shown.
244
src/collada.cpp
Normal file
244
src/collada.cpp
Normal file
@ -0,0 +1,244 @@
|
||||
#include <windows.h>
|
||||
#include <d3d10.h>
|
||||
|
||||
#include "directxmath/directxmath.h"
|
||||
|
||||
#include "print.hpp"
|
||||
#include "collada.hpp"
|
||||
|
||||
extern ID3D10Device * g_pd3dDevice;
|
||||
extern XMMATRIX g_View;
|
||||
extern XMMATRIX g_Projection;
|
||||
|
||||
namespace collada {
|
||||
static const float vertex_buffer[] = {
|
||||
-5.0, -5.0, 0.0, 0.0, 0.0, -1.0, 1.0, 0.0, 0.0,
|
||||
-5.0, 5.0, 0.0, 0.0, 0.0, -1.0, 1.0, 1.0, 0.0,
|
||||
5.0, 5.0, 0.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0,
|
||||
5.0, -5.0, 0.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0,
|
||||
-5.0, -5.0, 20.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0,
|
||||
5.0, -5.0, 20.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0,
|
||||
5.0, 5.0, 20.0, 0.0, 0.0, 1.0, 1.0, 1.0, 0.0,
|
||||
-5.0, 5.0, 20.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0,
|
||||
-5.0, -5.0, 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0,
|
||||
5.0, -5.0, 0.0, 0.0, -1.0, 0.0, 1.0, 0.0, 0.0,
|
||||
5.0, -5.0, 4.0, 0.0, -1.0, 0.0, 1.0, 0.2, 0.0,
|
||||
-5.0, -5.0, 4.0, 0.0, -1.0, 0.0, 0.0, 0.2, 0.0,
|
||||
5.0, -5.0, 8.0, 0.0, -1.0, 0.0, 1.0, 0.4, 0.0,
|
||||
-5.0, -5.0, 8.0, 0.0, -1.0, 0.0, 0.0, 0.4, 0.0,
|
||||
5.0, -5.0, 12.0, 0.0, -1.0, 0.0, 1.0, 0.6, 0.0,
|
||||
-5.0, -5.0, 12.0, 0.0, -1.0, 0.0, 0.0, 0.6, 0.0,
|
||||
5.0, -5.0, 16.0, 0.0, -1.0, 0.0, 1.0, 0.8, 0.0,
|
||||
-5.0, -5.0, 16.0, 0.0, -1.0, 0.0, 0.0, 0.8, 0.0,
|
||||
5.0, -5.0, 20.0, 0.0, -1.0, 0.0, 1.0, 1.0, 0.0,
|
||||
-5.0, -5.0, 20.0, 0.0, -1.0, 0.0, 0.0, 1.0, 0.0,
|
||||
5.0, -5.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
||||
5.0, 5.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 0.0,
|
||||
5.0, 5.0, 4.0, 1.0, 0.0, 0.0, 1.0, 0.2, 0.0,
|
||||
5.0, -5.0, 4.0, 1.0, 0.0, 0.0, 0.0, 0.2, 0.0,
|
||||
5.0, 5.0, 8.0, 1.0, 0.0, 0.0, 1.0, 0.4, 0.0,
|
||||
5.0, -5.0, 8.0, 1.0, 0.0, 0.0, 0.0, 0.4, 0.0,
|
||||
5.0, 5.0, 12.0, 1.0, 0.0, 0.0, 1.0, 0.6, 0.0,
|
||||
5.0, -5.0, 12.0, 1.0, 0.0, 0.0, 0.0, 0.6, 0.0,
|
||||
5.0, 5.0, 16.0, 1.0, 0.0, 0.0, 1.0, 0.8, 0.0,
|
||||
5.0, -5.0, 16.0, 1.0, 0.0, 0.0, 0.0, 0.8, 0.0,
|
||||
5.0, 5.0, 20.0, 1.0, 0.0, 0.0, 1.0, 1.0, 0.0,
|
||||
5.0, -5.0, 20.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0,
|
||||
5.0, 5.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0,
|
||||
-5.0, 5.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0,
|
||||
-5.0, 5.0, 4.0, 0.0, 1.0, 0.0, 1.0, 0.2, 0.0,
|
||||
5.0, 5.0, 4.0, 0.0, 1.0, 0.0, 0.0, 0.2, 0.0,
|
||||
-5.0, 5.0, 8.0, 0.0, 1.0, 0.0, 1.0, 0.4, 0.0,
|
||||
5.0, 5.0, 8.0, 0.0, 1.0, 0.0, 0.0, 0.4, 0.0,
|
||||
-5.0, 5.0, 12.0, 0.0, 1.0, 0.0, 1.0, 0.6, 0.0,
|
||||
5.0, 5.0, 12.0, 0.0, 1.0, 0.0, 0.0, 0.6, 0.0,
|
||||
-5.0, 5.0, 16.0, 0.0, 1.0, 0.0, 1.0, 0.8, 0.0,
|
||||
5.0, 5.0, 16.0, 0.0, 1.0, 0.0, 0.0, 0.8, 0.0,
|
||||
-5.0, 5.0, 20.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0,
|
||||
5.0, 5.0, 20.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0,
|
||||
-5.0, 5.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0,
|
||||
-5.0, -5.0, 0.0, -1.0, 0.0, 0.0, 1.0, 0.0, 0.0,
|
||||
-5.0, -5.0, 4.0, -1.0, 0.0, 0.0, 1.0, 0.2, 0.0,
|
||||
-5.0, 5.0, 4.0, -1.0, 0.0, 0.0, 0.0, 0.2, 0.0,
|
||||
-5.0, -5.0, 8.0, -1.0, 0.0, 0.0, 1.0, 0.4, 0.0,
|
||||
-5.0, 5.0, 8.0, -1.0, 0.0, 0.0, 0.0, 0.4, 0.0,
|
||||
-5.0, -5.0, 12.0, -1.0, 0.0, 0.0, 1.0, 0.6, 0.0,
|
||||
-5.0, 5.0, 12.0, -1.0, 0.0, 0.0, 0.0, 0.6, 0.0,
|
||||
-5.0, -5.0, 16.0, -1.0, 0.0, 0.0, 1.0, 0.8, 0.0,
|
||||
-5.0, 5.0, 16.0, -1.0, 0.0, 0.0, 0.0, 0.8, 0.0,
|
||||
-5.0, -5.0, 20.0, -1.0, 0.0, 0.0, 1.0, 1.0, 0.0,
|
||||
-5.0, 5.0, 20.0, -1.0, 0.0, 0.0, 0.0, 1.0, 0.0,
|
||||
};
|
||||
|
||||
static const int index_buffer[] = {
|
||||
0, 1, 2,
|
||||
2, 3, 0,
|
||||
4, 5, 6,
|
||||
6, 7, 4,
|
||||
8, 9, 10,
|
||||
10, 11, 8,
|
||||
11, 10, 12,
|
||||
12, 13, 11,
|
||||
13, 12, 14,
|
||||
14, 15, 13,
|
||||
15, 14, 16,
|
||||
16, 17, 15,
|
||||
17, 16, 18,
|
||||
18, 19, 17,
|
||||
20, 21, 22,
|
||||
22, 23, 20,
|
||||
23, 22, 24,
|
||||
24, 25, 23,
|
||||
25, 24, 26,
|
||||
26, 27, 25,
|
||||
27, 26, 28,
|
||||
28, 29, 27,
|
||||
29, 28, 30,
|
||||
30, 31, 29,
|
||||
32, 33, 34,
|
||||
34, 35, 32,
|
||||
35, 34, 36,
|
||||
36, 37, 35,
|
||||
37, 36, 38,
|
||||
38, 39, 37,
|
||||
39, 38, 40,
|
||||
40, 41, 39,
|
||||
41, 40, 42,
|
||||
42, 43, 41,
|
||||
44, 45, 46,
|
||||
46, 47, 44,
|
||||
47, 46, 48,
|
||||
48, 49, 47,
|
||||
49, 48, 50,
|
||||
50, 51, 49,
|
||||
51, 50, 52,
|
||||
52, 53, 51,
|
||||
53, 52, 54,
|
||||
54, 55, 53,
|
||||
};
|
||||
|
||||
ID3D10Effect * g_pEffect = NULL;
|
||||
ID3D10EffectTechnique * g_pTechniqueRender = NULL;
|
||||
ID3D10InputLayout * g_pVertexLayout = NULL;
|
||||
|
||||
ID3D10Buffer * g_pVertexBuffer;
|
||||
ID3D10Buffer * g_pIndexBuffer;
|
||||
|
||||
ID3D10EffectMatrixVariable * g_pWorldVariable = NULL;
|
||||
ID3D10EffectMatrixVariable * g_pViewVariable = NULL;
|
||||
ID3D10EffectMatrixVariable * g_pProjectionVariable = NULL;
|
||||
|
||||
HRESULT LoadEffect()
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
HRSRC hRes = FindResource(NULL, L"RES_COLLADA_FXO", RT_RCDATA);
|
||||
if (hRes == NULL) {
|
||||
print("FindResource RES_COLLADA_FXO\n");
|
||||
return E_FAIL;
|
||||
}
|
||||
DWORD dwResSize = SizeofResource(NULL, hRes);
|
||||
HGLOBAL hData = LoadResource(NULL, hRes);
|
||||
void * pData = LockResource(hData);
|
||||
hr = D3D10CreateEffectFromMemory(pData,
|
||||
dwResSize,
|
||||
0,
|
||||
g_pd3dDevice,
|
||||
NULL,
|
||||
&g_pEffect
|
||||
);
|
||||
if (FAILED(hr)) {
|
||||
print("D3D10CreateEffectFromMemory\n");
|
||||
return hr;
|
||||
}
|
||||
g_pTechniqueRender = g_pEffect->GetTechniqueByName("Render");
|
||||
|
||||
// variables
|
||||
g_pWorldVariable = g_pEffect->GetVariableByName("World")->AsMatrix();
|
||||
g_pViewVariable = g_pEffect->GetVariableByName("View")->AsMatrix();
|
||||
g_pProjectionVariable = g_pEffect->GetVariableByName("Projection")->AsMatrix();
|
||||
|
||||
// layout
|
||||
D3D10_INPUT_ELEMENT_DESC layout[] = {
|
||||
{"POSITION" , 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0 , D3D10_INPUT_PER_VERTEX_DATA, 0},
|
||||
{"NORMAL" , 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0},
|
||||
{"TEXCOORD" , 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 24, D3D10_INPUT_PER_VERTEX_DATA, 0},
|
||||
};
|
||||
UINT numElements = (sizeof (layout)) / (sizeof (layout[0]));
|
||||
|
||||
D3D10_PASS_DESC passDesc;
|
||||
g_pTechniqueRender->GetPassByIndex(0)->GetDesc(&passDesc);
|
||||
|
||||
hr = g_pd3dDevice->CreateInputLayout(layout, numElements,
|
||||
passDesc.pIAInputSignature,
|
||||
passDesc.IAInputSignatureSize,
|
||||
&g_pVertexLayout);
|
||||
if (FAILED(hr)) {
|
||||
print("CreateInputLayout\n");
|
||||
return hr;
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
HRESULT LoadMesh()
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
D3D10_BUFFER_DESC bd;
|
||||
D3D10_SUBRESOURCE_DATA initData;
|
||||
|
||||
bd.Usage = D3D10_USAGE_IMMUTABLE;
|
||||
bd.ByteWidth = (sizeof (vertex_buffer));
|
||||
bd.BindFlags = D3D10_BIND_VERTEX_BUFFER;
|
||||
bd.CPUAccessFlags = 0;
|
||||
bd.MiscFlags = 0;
|
||||
initData.pSysMem = vertex_buffer;
|
||||
hr = g_pd3dDevice->CreateBuffer(&bd, &initData, &g_pVertexBuffer);
|
||||
if (FAILED(hr)) {
|
||||
print("CreateBuffer: D3D10_BIND_VERTEX_BUFFER\n");
|
||||
return hr;
|
||||
}
|
||||
|
||||
bd.Usage = D3D10_USAGE_IMMUTABLE;
|
||||
bd.ByteWidth = (sizeof (index_buffer));
|
||||
bd.BindFlags = D3D10_BIND_INDEX_BUFFER;
|
||||
bd.CPUAccessFlags = 0;
|
||||
bd.MiscFlags = 0;
|
||||
initData.pSysMem = index_buffer;
|
||||
hr = g_pd3dDevice->CreateBuffer(&bd, &initData, &g_pIndexBuffer);
|
||||
if (FAILED(hr)) {
|
||||
print("CreateBuffer: D3D10_BIND_INDEX_BUFFER\n");
|
||||
return hr;
|
||||
}
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
void Render()
|
||||
{
|
||||
XMMATRIX World = XMMatrixScaling(0.1, 0.1, 0.1);
|
||||
|
||||
g_pWorldVariable->SetMatrix((float *)&World);
|
||||
g_pViewVariable->SetMatrix((float *)&g_View);
|
||||
g_pProjectionVariable->SetMatrix((float *)&g_Projection);
|
||||
|
||||
UINT stride[] = {
|
||||
3 * 3 * 4,
|
||||
};
|
||||
UINT offset[] = { 0 };
|
||||
g_pd3dDevice->IASetInputLayout(g_pVertexLayout);
|
||||
g_pd3dDevice->IASetVertexBuffers(0, 1, &g_pVertexBuffer, stride, offset);
|
||||
g_pd3dDevice->IASetIndexBuffer(g_pIndexBuffer, DXGI_FORMAT_R32_UINT, 0);
|
||||
g_pd3dDevice->IASetPrimitiveTopology(D3D10_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
|
||||
|
||||
D3D10_TECHNIQUE_DESC techDesc;
|
||||
g_pTechniqueRender->GetDesc(&techDesc);
|
||||
|
||||
int indices_length = (sizeof (index_buffer)) / (sizeof (int));
|
||||
for (UINT p = 0; p < techDesc.Passes; p++) {
|
||||
g_pTechniqueRender->GetPassByIndex(p)->Apply(0);
|
||||
g_pd3dDevice->DrawIndexed(indices_length, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
60
src/effect/collada.fx
Normal file
60
src/effect/collada.fx
Normal file
@ -0,0 +1,60 @@
|
||||
matrix World;
|
||||
matrix View;
|
||||
matrix Projection;
|
||||
|
||||
struct VS_INPUT
|
||||
{
|
||||
float4 Pos : POSITION;
|
||||
float3 Normal : NORMAL;
|
||||
float2 Tex : TEXCOORD0;
|
||||
};
|
||||
|
||||
struct PS_INPUT
|
||||
{
|
||||
float4 Pos : SV_POSITION;
|
||||
float3 Normal : NORMAL;
|
||||
float2 Tex : TEXCOORD0;
|
||||
};
|
||||
|
||||
PS_INPUT VS(VS_INPUT input)
|
||||
{
|
||||
PS_INPUT output;
|
||||
|
||||
output.Pos = mul(input.Pos, World);
|
||||
output.Pos = mul(output.Pos, View);
|
||||
output.Pos = mul(output.Pos, Projection);
|
||||
|
||||
output.Normal = input.Normal;
|
||||
output.Tex = input.Tex;
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
float4 PS(PS_INPUT input) : SV_Target
|
||||
{
|
||||
//return float4(input.Normal * 0.5 + 0.5, 1);
|
||||
return float4(input.Tex.xy, 0, 1);
|
||||
}
|
||||
|
||||
BlendState DisableBlending
|
||||
{
|
||||
BlendEnable[0] = FALSE;
|
||||
};
|
||||
|
||||
DepthStencilState EnableDepth
|
||||
{
|
||||
DepthEnable = TRUE;
|
||||
DepthWriteMask = ALL;
|
||||
};
|
||||
|
||||
technique10 Render
|
||||
{
|
||||
pass P0
|
||||
{
|
||||
SetVertexShader(CompileShader(vs_4_0, VS()));
|
||||
SetGeometryShader(NULL);
|
||||
SetPixelShader(CompileShader(ps_4_0, PS()));
|
||||
SetBlendState(DisableBlending, float4(0.0, 0.0, 0.0, 0.0), 0xffffffff);
|
||||
SetDepthStencilState(EnableDepth, 0);
|
||||
}
|
||||
}
|
||||
63
src/main.cpp
63
src/main.cpp
@ -17,6 +17,8 @@
|
||||
#define ROOT_MESH_NODE robot_player::node_39
|
||||
#include "cube.hpp"
|
||||
|
||||
#include "collada.hpp"
|
||||
|
||||
HINSTANCE g_hInstance = NULL;
|
||||
HWND g_hWnd = NULL;
|
||||
ID3D10Device * g_pd3dDevice = NULL;
|
||||
@ -132,8 +134,8 @@ XMVECTOR g_At = XMVectorSet(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
HRESULT InitWindow(HINSTANCE hInstance, int nCmdShow);
|
||||
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
|
||||
HRESULT InitDirect3DDevice();
|
||||
void Render(float t);
|
||||
void Update(float t);
|
||||
void Render(float t, float dt);
|
||||
void Update(float t, float dt);
|
||||
BOOL Resize();
|
||||
void InitializeNodeInstances();
|
||||
|
||||
@ -186,6 +188,15 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLi
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (FAILED(collada::LoadEffect())) {
|
||||
print("collada::LoadEffect\n");
|
||||
return 0;
|
||||
}
|
||||
if (FAILED(collada::LoadMesh())) {
|
||||
print("collada::LoadMesh\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
InitializeNodeInstances();
|
||||
|
||||
if (FAILED(InitInput(hInstance))) {
|
||||
@ -193,6 +204,12 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLi
|
||||
return 0;
|
||||
}
|
||||
|
||||
LARGE_INTEGER frequency;
|
||||
LARGE_INTEGER start;
|
||||
LARGE_INTEGER end;
|
||||
QueryPerformanceFrequency(&frequency);
|
||||
QueryPerformanceCounter(&start);
|
||||
|
||||
MSG msg = {};
|
||||
while (msg.message != WM_QUIT) {
|
||||
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
|
||||
@ -214,11 +231,20 @@ int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR lpCmdLi
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
} else {
|
||||
QueryPerformanceCounter(&end);
|
||||
uint64_t elapsed = end.QuadPart - start.QuadPart;
|
||||
float dt = (double)elapsed / (double)frequency.QuadPart;
|
||||
elapsed *= 1000000;
|
||||
elapsed /= frequency.QuadPart;
|
||||
if (elapsed < 16667)
|
||||
continue;
|
||||
start.QuadPart = end.QuadPart;
|
||||
|
||||
if (Resize()) {
|
||||
UpdateInput();
|
||||
float t = GetTime();
|
||||
Update(t);
|
||||
Render(t);
|
||||
Update(t, dt);
|
||||
Render(t, dt);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1045,7 +1071,8 @@ HRESULT InitDirect3DDevice()
|
||||
|
||||
D3D10_RASTERIZER_DESC RSDesc;
|
||||
RSDesc.FillMode = D3D10_FILL_SOLID;
|
||||
RSDesc.CullMode = D3D10_CULL_BACK;
|
||||
//RSDesc.CullMode = D3D10_CULL_BACK;
|
||||
RSDesc.CullMode = D3D10_CULL_NONE;
|
||||
RSDesc.FrontCounterClockwise = FALSE;
|
||||
RSDesc.DepthBias = 0;
|
||||
RSDesc.SlopeScaledDepthBias = 0.0f;
|
||||
@ -1473,7 +1500,7 @@ static inline int sprint(LPCSTR fmt, ...)
|
||||
return length;
|
||||
}
|
||||
|
||||
void RenderFont()
|
||||
void RenderFont(float dt)
|
||||
{
|
||||
HRESULT hr;
|
||||
|
||||
@ -1496,7 +1523,8 @@ void RenderFont()
|
||||
" thumbLX: % 5.3f\n"
|
||||
" thumbLY: % 5.3f\n"
|
||||
" thumbRX: % 5.3f\n"
|
||||
" thumbRY: % 5.3f",
|
||||
" thumbRY: % 5.3f\n"
|
||||
" dt: % 8.5f\n",
|
||||
g_bloomPasses,
|
||||
g_exposure,
|
||||
g_Joystate.triggerL,
|
||||
@ -1504,7 +1532,8 @@ void RenderFont()
|
||||
g_Joystate.thumbLX,
|
||||
g_Joystate.thumbLY,
|
||||
g_Joystate.thumbRX,
|
||||
g_Joystate.thumbRY);
|
||||
g_Joystate.thumbRY,
|
||||
dt);
|
||||
|
||||
const char start_advance = 10;
|
||||
int hadvance = start_advance;
|
||||
@ -1664,7 +1693,7 @@ float deadzone(float f)
|
||||
}
|
||||
}
|
||||
|
||||
void Update(float t)
|
||||
void Update(float t, float dt)
|
||||
{
|
||||
XMVECTOR vLightDirs[2] = {
|
||||
{-0.577f, 0.577f, 0.0, 1.0},
|
||||
@ -1681,12 +1710,12 @@ void Update(float t)
|
||||
|
||||
// view
|
||||
XMMATRIX mRotateView
|
||||
= XMMatrixRotationY(deadzone(g_Joystate.thumbLX) * 0.002f)
|
||||
* XMMatrixRotationX(deadzone(g_Joystate.thumbLY) * 0.002f);
|
||||
= XMMatrixRotationY(deadzone(g_Joystate.thumbLX) * 3.0f * dt)
|
||||
* XMMatrixRotationX(deadzone(g_Joystate.thumbLY) * 3.0f * dt);
|
||||
|
||||
XMMATRIX mTranslateView = XMMatrixTranslation(deadzone(g_Joystate.thumbRX) * 0.002f,
|
||||
XMMATRIX mTranslateView = XMMatrixTranslation(deadzone(g_Joystate.thumbRX) * 3.0f * dt,
|
||||
0.0f,
|
||||
deadzone(g_Joystate.thumbRY) * 0.002f);
|
||||
deadzone(g_Joystate.thumbRY) * 3.0f * dt);
|
||||
|
||||
g_Eye = XMVector4Transform(g_Eye, mTranslateView * mRotateView);
|
||||
XMVECTOR Up = XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f);
|
||||
@ -1770,7 +1799,7 @@ void RenderVolumeMesh()
|
||||
}
|
||||
}
|
||||
|
||||
void Render(float t)
|
||||
void Render(float t, float dt)
|
||||
{
|
||||
// clear
|
||||
|
||||
@ -1794,9 +1823,11 @@ void Render(float t)
|
||||
//RenderBloom();
|
||||
//print("%f\n", t);
|
||||
//RenderVolume(t);
|
||||
RenderVolumeMesh();
|
||||
//RenderVolumeMesh();
|
||||
|
||||
RenderFont();
|
||||
RenderFont(dt);
|
||||
|
||||
collada::Render();
|
||||
|
||||
// present
|
||||
g_pSwapChain->Present(0, 0);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user