collada/header: add lights

This also automates the collada header/buffer build process.
This commit is contained in:
Zack Buhman 2026-01-28 20:53:12 -06:00
parent 683115e0c1
commit 4d952b0a90
12 changed files with 867 additions and 399 deletions

View File

@ -50,11 +50,10 @@ SHADERS = \
$(BUILD_TYPE)/effect/collada.fxo \
$(BUILD_TYPE)/effect/collada_scene.fxo
BUFFERS = \
models/curve_interpolation/curve_interpolation.vtx \
models/curve_interpolation/curve_interpolation.idx
SCENES = \
src/scenes/curve_interpolation/curve_interpolation.cpp
$(BUILD_TYPE)/%.res: %.rc $(SHADERS) $(BUFFERS)
$(BUILD_TYPE)/%.res: %.rc $(SHADERS) $(SCENES)
@mkdir -p $(@D)
$(WINDRES) -O coff -I$(BUILD_TYPE)/effect -o $@ $<
@ -62,6 +61,17 @@ $(BUILD_TYPE)/%.obj: src/%.cpp
@mkdir -p $(@D)
$(CXX) $(CXXSTD) $(CFLAGS) $(CXXFLAGS) $(WOPT) $(OPT) -o $@ -c $<
COLLADA_PY_SOURCE = \
$(wildcard collada/*.py)
include/scenes/%.hpp: $(COLLADA_PY_SOURCE)
@mkdir -p $(@D)
PYTHONPATH=. python -m collada.main $@
src/scenes/%.cpp: scenes/%.DAE include/scenes/%.hpp
@mkdir -p $(@D)
PYTHONPATH=. python -m collada.main $< $@ $(<:.DAE=.vtx) $(<:.DAE=.idx)
OBJS = \
$(BUILD_TYPE)/main.res \
$(BUILD_TYPE)/robot_player.obj \
@ -72,7 +82,7 @@ OBJS = \
$(BUILD_TYPE)/input.obj \
$(BUILD_TYPE)/collada.obj \
$(BUILD_TYPE)/collada_scene.obj \
$(BUILD_TYPE)/scenes/curve_interpolation.obj
$(BUILD_TYPE)/scenes/curve_interpolation/curve_interpolation.obj
$(BUILD_TYPE)/d3d10.exe: $(OBJS)
@mkdir -p $(@D)

View File

@ -310,12 +310,23 @@ def render_node_channels(state, collada, node, node_name):
yield f"&node_channel_{target_name},"
yield "};"
def render_node_instance_lights(state, collada, node_name, instance_lights):
yield f"instance_light const instance_lights_{node_name}[] = {{"
for instance_light in instance_lights:
light = collada.lookup(instance_light.url, types.Light)
light_name = sanitize_name(state, light.id, light)
yield "{"
yield f".light = &light_{light_name},"
yield "}"
yield "};"
def render_node(state, collada, node, node_index):
node_name_id = get_node_name_id(node)
node_name = sanitize_name(state, node_name_id, node)
#yield from render_node_children(state, collada, node_name, node.nodes)
yield from render_node_transforms(state, collada, node_name, node.transformation_elements)
yield from render_node_instance_geometries(state, collada, node_name, node.instance_geometries)
yield from render_node_instance_lights(state, collada, node_name, node.instance_lights)
yield from render_node_channels(state, collada, node, node_name)
type = {
@ -334,6 +345,9 @@ def render_node(state, collada, node, node_index):
yield f".instance_geometries = instance_geometries_{node_name},"
yield f".instance_geometries_count = {len(node.instance_geometries)},"
yield ""
yield f".instance_lights = instance_lights_{node_name},"
yield f".instance_lights_count = {len(node.instance_lights)},"
yield ""
yield f".channels = node_channels_{node_name},"
yield f".channels_count = {len(state.node_animation_channels[node.id])},"
#yield ""
@ -392,69 +406,72 @@ def render_opt_float(field_name, f):
f = types.Float(value=0.0)
yield f".{field_name} = {float(f.value)}f,"
def render_effect(state, collada, effect):
profile_common, = effect.profile_common
assert profile_common.newparam == []
shader = profile_common.technique.shader
effect_name = sanitize_name(state, effect.id, effect)
yield f"effect const effect_{effect_name} = {{"
if type(shader) is types.Blinn:
yield ".type = effect_type::BLINN,"
yield ".blinn = {"
yield from render_opt_color_or_texture("emission", shader.emission)
yield from render_opt_color_or_texture("ambient", shader.ambient)
yield from render_opt_color_or_texture("diffuse", shader.diffuse)
yield from render_opt_color_or_texture("specular", shader.specular)
yield from render_opt_float("shininess", shader.shininess)
yield from render_opt_color_or_texture("reflective", shader.reflective)
yield from render_opt_float("reflectivity", shader.reflectivity)
yield from render_opt_color_or_texture("transparent", shader.transparent)
yield from render_opt_float("transparency", shader.transparency)
yield from render_opt_float("index_of_refraction", shader.index_of_refraction)
yield "}"
elif type(shader) is types.Lambert:
yield ".type = effect_type::LAMBERT,"
yield ".lambert = {"
yield from render_opt_color_or_texture("emission", shader.emission)
yield from render_opt_color_or_texture("ambient", shader.ambient)
yield from render_opt_color_or_texture("diffuse", shader.diffuse)
yield from render_opt_color_or_texture("reflective", shader.reflective)
yield from render_opt_float("reflectivity", shader.reflectivity)
yield from render_opt_color_or_texture("transparent", shader.transparent)
yield from render_opt_float("transparency", shader.transparency)
yield from render_opt_float("index_of_refraction", shader.index_of_refraction)
yield "}"
elif type(shader) is types.Phong:
yield ".type = effect_type::PHONG,"
yield ".phong = {"
yield from render_opt_color_or_texture("emission", shader.emission)
yield from render_opt_color_or_texture("ambient", shader.ambient)
yield from render_opt_color_or_texture("diffuse", shader.diffuse)
yield from render_opt_color_or_texture("specular", shader.specular)
yield from render_opt_float("shininess", shader.shininess)
yield from render_opt_color_or_texture("reflective", shader.reflective)
yield from render_opt_float("reflectivity", shader.reflectivity)
yield from render_opt_color_or_texture("transparent", shader.transparent)
yield from render_opt_float("transparency", shader.transparency)
yield from render_opt_float("index_of_refraction", shader.index_of_refraction)
yield "}"
elif type(shader) is types.Constant:
yield ".type = effect_type::CONSTANT,"
yield ".constant = {"
yield from render_opt_color("color", shader.color)
yield from render_opt_color_or_texture("reflective", shader.reflective)
yield from render_opt_float("reflectivity", shader.reflectivity)
yield from render_opt_color_or_texture("transparent", shader.transparent)
yield from render_opt_float("transparency", shader.transparency)
yield from render_opt_float("index_of_refraction", shader.index_of_refraction)
yield "}"
else:
assert False, type(shader)
yield "};"
def render_library_effects(state, collada):
for library_effects in collada.library_effects:
for effect in library_effects.effects:
profile_common, = effect.profile_common
assert profile_common.newparam == []
shader = profile_common.technique.shader
effect_name = sanitize_name(state, effect.id, effect)
yield f"effect const effect_{effect_name} = {{"
if type(shader) is types.Blinn:
yield ".type = effect_type::BLINN,"
yield ".blinn = {"
yield from render_opt_color_or_texture("emission", shader.emission)
yield from render_opt_color_or_texture("ambient", shader.ambient)
yield from render_opt_color_or_texture("diffuse", shader.diffuse)
yield from render_opt_color_or_texture("specular", shader.specular)
yield from render_opt_float("shininess", shader.shininess)
yield from render_opt_color_or_texture("reflective", shader.reflective)
yield from render_opt_float("reflectivity", shader.reflectivity)
yield from render_opt_color_or_texture("transparent", shader.transparent)
yield from render_opt_float("transparency", shader.transparency)
yield from render_opt_float("index_of_refraction", shader.index_of_refraction)
yield "}"
elif type(shader) is types.Lambert:
yield ".type = effect_type::LAMBERT,"
yield ".lambert = {"
yield from render_opt_color_or_texture("emission", shader.emission)
yield from render_opt_color_or_texture("ambient", shader.ambient)
yield from render_opt_color_or_texture("diffuse", shader.diffuse)
yield from render_opt_color_or_texture("reflective", shader.reflective)
yield from render_opt_float("reflectivity", shader.reflectivity)
yield from render_opt_color_or_texture("transparent", shader.transparent)
yield from render_opt_float("transparency", shader.transparency)
yield from render_opt_float("index_of_refraction", shader.index_of_refraction)
yield "}"
elif type(shader) is types.Phong:
yield ".type = effect_type::PHONG,"
yield ".phong = {"
yield from render_opt_color_or_texture("emission", shader.emission)
yield from render_opt_color_or_texture("ambient", shader.ambient)
yield from render_opt_color_or_texture("diffuse", shader.diffuse)
yield from render_opt_color_or_texture("specular", shader.specular)
yield from render_opt_float("shininess", shader.shininess)
yield from render_opt_color_or_texture("reflective", shader.reflective)
yield from render_opt_float("reflectivity", shader.reflectivity)
yield from render_opt_color_or_texture("transparent", shader.transparent)
yield from render_opt_float("transparency", shader.transparency)
yield from render_opt_float("index_of_refraction", shader.index_of_refraction)
yield "}"
elif type(shader) is types.Constant:
yield ".type = effect_type::CONSTANT,"
yield ".constant = {"
yield from render_opt_color("color", shader.color)
yield from render_opt_color_or_texture("reflective", shader.reflective)
yield from render_opt_float("reflectivity", shader.reflectivity)
yield from render_opt_color_or_texture("transparent", shader.transparent)
yield from render_opt_float("transparency", shader.transparency)
yield from render_opt_float("index_of_refraction", shader.index_of_refraction)
yield "}"
else:
assert False, type(shader)
yield "};"
yield from render_effect(state, collada, effect)
def render_library_materials(state, collada):
for library_materials in collada.library_materials:
@ -655,10 +672,34 @@ def render_library_animations(state, collada):
yield from render_animation(state, collada, animation_name, animation)
animation_ix += 1
def render_light_type(technique_common: types.TechniqueCommon_Light):
return {
types.Ambient: "AMBIENT",
types.Directional: "DIRECTIONAL",
types.Point: "POINT",
types.Spot: "SPOT",
}[type(technique_common.light)]
def render_light(state, collada, light):
technique_common = light.technique_common
light_name = sanitize_name(state, light.id, light)
color = ", ".join(f"{float(f)}f" for f in technique_common.light.color)
light_type = render_light_type(technique_common)
yield f"light const light_{light_name} = {{"
yield f".type = light_type::{light_type},"
yield f".color = {{ {color} }},"
yield "};"
def render_library_lights(state, collada):
for library_lights in collada.library_lights:
for light in library_lights.lights:
yield from render_light(state, collada, light)
def render_all(collada, namespace):
state = State()
render, out = renderer()
render(render_header(namespace))
render(render_library_lights(state, collada))
render(render_library_animations(state, collada))
render(render_library_effects(state, collada))
render(render_library_materials(state, collada))

View File

@ -6,44 +6,61 @@ from collada import header
def usage():
name = sys.argv[0]
print("usage:")
print(f" {name} [input_collada.dae] [output_source.cpp] [output_header.hpp] [output_vertex.vtx] [output_vertex.idx]")
print("usage (source):")
print(f" {name} [input_collada.dae] [output_source.cpp] [output_vertex.vtx] [output_vertex.idx]")
print("usage (header):")
print(f" {name} [output_header.hpp]")
sys.exit(1)
def parse_namespace(filename):
namespace = path.splitext(path.split(filename)[1])[0]
return namespace
def main():
try:
input_collada = sys.argv[1]
output_source = sys.argv[2]
output_header = sys.argv[3]
output_vertex = sys.argv[4]
output_index = sys.argv[5]
output_vertex = sys.argv[3]
output_index = sys.argv[4]
assert input_collada.lower().endswith(".dae")
assert output_header.lower().endswith(".hpp")
assert output_source.lower().endswith(".cpp")
assert output_vertex.lower().endswith(".vtx")
assert output_index.lower().endswith(".idx")
except Exception as e:
usage()
collada = parse.parse_collada_file(input_collada)
namespace = path.splitext(path.split(input_collada)[1])[0]
namespace = parse_namespace(input_collada)
state, out_source = header.render_all(collada, namespace)
out_header = header.render_all_hpp(namespace)
with open(output_source, 'wb') as f:
source_buf = out_source.getvalue()
assert "\r\n" in source_buf
f.write(source_buf.encode('utf-8'))
with open(output_header, 'wb') as f:
header_buf = out_header.getvalue()
assert "\r\n" in header_buf
f.write(header_buf.encode('utf-8'))
with open(output_vertex, 'wb') as f:
f.write(state.vertex_buffer.getvalue())
with open(output_index, 'wb') as f:
f.write(state.index_buffer.getvalue())
def main_header():
try:
output_header = sys.argv[1]
assert output_header.lower().endswith(".hpp")
except Exception as e:
usage()
namespace = parse_namespace(output_header)
out_header = header.render_all_hpp(namespace)
with open(output_header, 'wb') as f:
header_buf = out_header.getvalue()
assert "\r\n" in header_buf
f.write(header_buf.encode('utf-8'))
if __name__ == "__main__":
main()
if len(sys.argv) == 2:
main_header()
else:
main()

View File

@ -37,20 +37,33 @@ namespace collada_scene {
node_instance * m_nodeInstances = NULL;
XMFLOAT4 * m_lightPositions = NULL;
XMFLOAT4 * m_lightDirections = NULL;
XMFLOAT4 * m_lightColors = NULL;
int m_lightInstancesCount = 0;
collada::descriptor const * m_descriptor;
HRESULT load_scene(collada::descriptor const * const descriptor);
void render(float t);
void update(float t);
void render();
private:
HRESULT load_layouts();
void allocate_node_instances();
void allocate_node_instance(collada::node const * const node,
node_instance * node_instance);
void allocate_light_instances();
void node_world_transform(collada::node const& node, node_instance& node_instance);
void update_light_instances();
void update_light_instance_vectors(collada::light const& light,
node_instance const& node_instance,
int light_index);
void render_geometries(collada::instance_geometry const * const instance_geometries,
int const instance_geometries_count);
void node_world_transform(collada::node const& node, node_instance& node_instance);
};
HRESULT LoadEffect();

View File

@ -81,47 +81,24 @@ namespace collada {
};
//////////////////////////////////////////////////////////////////////
// node
// light
//////////////////////////////////////////////////////////////////////
struct lookat {
float3 const eye;
float3 const at;
float3 const up;
enum class light_type {
AMBIENT,
DIRECTIONAL,
POINT,
SPOT,
};
struct matrix {
float const _11, _12, _13, _14;
float const _21, _22, _23, _24;
float const _31, _32, _33, _34;
float const _41, _42, _43, _44;
struct light {
light_type type;
float3 color;
};
enum class transform_type {
LOOKAT,
MATRIX,
ROTATE,
SCALE,
SKEW,
TRANSLATE,
};
struct transform {
transform_type const type;
union {
lookat const lookat;
matrix const matrix;
float4 const rotate;
float3 const scale;
float7 const skew;
float3 const translate;
};
};
enum class node_type {
JOINT,
NODE,
};
//////////////////////////////////////////////////////////////////////
// effect
//////////////////////////////////////////////////////////////////////
struct color_or_texture {
union {
@ -192,12 +169,55 @@ namespace collada {
};
};
//////////////////////////////////////////////////////////////////////
// node
//////////////////////////////////////////////////////////////////////
struct lookat {
float3 const eye;
float3 const at;
float3 const up;
};
struct matrix {
float const _11, _12, _13, _14;
float const _21, _22, _23, _24;
float const _31, _32, _33, _34;
float const _41, _42, _43, _44;
};
enum class transform_type {
LOOKAT,
MATRIX,
ROTATE,
SCALE,
SKEW,
TRANSLATE,
};
struct transform {
transform_type const type;
union {
lookat const lookat;
matrix const matrix;
float4 const rotate;
float3 const scale;
float7 const skew;
float3 const translate;
};
};
enum class node_type {
JOINT,
NODE,
};
struct material {
effect const * const effect;
};
struct instance_material {
int element_index;
int element_index; // an index into mesh.triangles
material const * const material;
};
@ -208,6 +228,10 @@ namespace collada {
int const instance_materials_count;
};
struct instance_light {
light const * const light;
};
//////////////////////////////////////////////////////////////////////
// animation
//////////////////////////////////////////////////////////////////////
@ -286,6 +310,9 @@ namespace collada {
instance_geometry const * const instance_geometries;
int const instance_geometries_count;
instance_light const * const instance_lights;
int const instance_lights_count;
channel const * const * const channels;
int const channels_count;

View File

@ -10,5 +10,5 @@ RES_FONT_TERMINUS_6X12 RCDATA "font/terminus_128x64_6x12.data"
RES_COLLADA_FXO RCDATA "collada.fxo"
RES_COLLADA_SCENE_FXO RCDATA "collada_scene.fxo"
RES_MODELS_CURVE_INTERPOLATION_VTX RCDATA "models/curve_interpolation/curve_interpolation.vtx"
RES_MODELS_CURVE_INTERPOLATION_IDX RCDATA "models/curve_interpolation/curve_interpolation.idx"
RES_MODELS_CURVE_INTERPOLATION_VTX RCDATA "scenes/curve_interpolation/curve_interpolation.vtx"
RES_MODELS_CURVE_INTERPOLATION_IDX RCDATA "scenes/curve_interpolation/curve_interpolation.idx"

View File

@ -4,6 +4,16 @@ namespace curve_interpolation {
using namespace collada;
light const light_environmentambientlight = {
.type = light_type::AMBIENT,
.color = { 0.0f, 0.0f, 0.0f },
};
light const light_light_light = {
.type = light_type::DIRECTIONAL,
.color = { 1.0f, 1.0f, 1.0f },
};
float const array_node_cube_translation_x_input_array[] = {
0.0f,
1.666667f,
@ -140,7 +150,7 @@ sampler const sampler_node_cube_translation_y_sampler = {
},
};
float const array_node_torus001_rotationx_angle_input_array[] = {
float const array_node_torus_rotationx_angle_input_array[] = {
0.0f,
0.8333334f,
1.666667f,
@ -148,7 +158,7 @@ float const array_node_torus001_rotationx_angle_input_array[] = {
3.333333f,
};
float const array_node_torus001_rotationx_angle_output_array[] = {
float const array_node_torus_rotationx_angle_output_array[] = {
0.0f,
-90.0f,
-180.0f,
@ -156,7 +166,7 @@ float const array_node_torus001_rotationx_angle_output_array[] = {
-360.0f,
};
float const array_node_torus001_rotationx_angle_intangent_array[] = {
float const array_node_torus_rotationx_angle_intangent_array[] = {
0.9997917f, 0.0f,
0.3270486f, -89.70257f,
0.9961964f, -179.1937f,
@ -164,7 +174,7 @@ float const array_node_torus001_rotationx_angle_intangent_array[] = {
2.6534f, -360.0f,
};
float const array_node_torus001_rotationx_angle_outtangent_array[] = {
float const array_node_torus_rotationx_angle_outtangent_array[] = {
0.6602973f, 0.0f,
1.324714f, -90.28867f,
2.332406f, -180.8006f,
@ -172,7 +182,7 @@ float const array_node_torus001_rotationx_angle_outtangent_array[] = {
2.333542f, -360.0f,
};
enum interpolation const array_node_torus001_rotationx_angle_interpolation_array[] = {
enum interpolation const array_node_torus_rotationx_angle_interpolation_array[] = {
interpolation::BEZIER,
interpolation::BEZIER,
interpolation::BEZIER,
@ -180,175 +190,175 @@ enum interpolation const array_node_torus001_rotationx_angle_interpolation_array
interpolation::BEZIER,
};
sampler const sampler_node_torus001_rotationx_angle_sampler = {
// node_torus001_rotationx_angle_input
sampler const sampler_node_torus_rotationx_angle_sampler = {
// node_torus_rotationx_angle_input
.input = {
.float_array = array_node_torus001_rotationx_angle_input_array,
.float_array = array_node_torus_rotationx_angle_input_array,
.count = 5,
.stride = 1,
},
// node_torus001_rotationx_angle_output
// node_torus_rotationx_angle_output
.output = {
.float_array = array_node_torus001_rotationx_angle_output_array,
.float_array = array_node_torus_rotationx_angle_output_array,
.count = 5,
.stride = 1,
},
// node_torus001_rotationx_angle_intangent
// node_torus_rotationx_angle_intangent
.in_tangent = {
.float_array = array_node_torus001_rotationx_angle_intangent_array,
.float_array = array_node_torus_rotationx_angle_intangent_array,
.count = 5,
.stride = 2,
},
// node_torus001_rotationx_angle_outtangent
// node_torus_rotationx_angle_outtangent
.out_tangent = {
.float_array = array_node_torus001_rotationx_angle_outtangent_array,
.float_array = array_node_torus_rotationx_angle_outtangent_array,
.count = 5,
.stride = 2,
},
// node_torus001_rotationx_angle_interpolation
// node_torus_rotationx_angle_interpolation
.interpolation = {
.interpolation_array = array_node_torus001_rotationx_angle_interpolation_array,
.interpolation_array = array_node_torus_rotationx_angle_interpolation_array,
.count = 5,
.stride = 1,
},
};
float const array_node_geosphere001_scale_input_array[] = {
float const array_node_geosphere_scale_input_array[] = {
0.0f,
1.666667f,
3.333333f,
};
float const array_node_geosphere001_scale_output_array[] = {
float const array_node_geosphere_scale_output_array[] = {
1.0f, 1.0f, 1.0f,
1.996525f, 1.996525f, 1.996525f,
1.0f, 1.0f, 1.0f,
};
float const array_node_geosphere001_scale_intangent_array[] = {
float const array_node_geosphere_scale_intangent_array[] = {
0.9997917f, 1.0f, 0.9997917f, 1.0f, 0.9997917f, 1.0f,
1.111167f, 1.996525f, 1.111167f, 1.996525f, 1.111167f, 1.996525f,
2.777833f, 1.0f, 2.777833f, 1.0f, 2.777833f, 1.0f,
};
float const array_node_geosphere001_scale_outtangent_array[] = {
float const array_node_geosphere_scale_outtangent_array[] = {
0.5555f, 1.0f, 0.5555f, 1.0f, 0.5555f, 1.0f,
2.222167f, 1.996525f, 2.222167f, 1.996525f, 2.222167f, 1.996525f,
2.333542f, 1.0f, 2.333542f, 1.0f, 2.333542f, 1.0f,
};
enum interpolation const array_node_geosphere001_scale_interpolation_array[] = {
enum interpolation const array_node_geosphere_scale_interpolation_array[] = {
interpolation::BEZIER,
interpolation::BEZIER,
interpolation::BEZIER,
};
sampler const sampler_node_geosphere001_scale_sampler = {
// node_geosphere001_scale_input
sampler const sampler_node_geosphere_scale_sampler = {
// node_geosphere_scale_input
.input = {
.float_array = array_node_geosphere001_scale_input_array,
.float_array = array_node_geosphere_scale_input_array,
.count = 3,
.stride = 1,
},
// node_geosphere001_scale_output
// node_geosphere_scale_output
.output = {
.float_array = array_node_geosphere001_scale_output_array,
.float_array = array_node_geosphere_scale_output_array,
.count = 3,
.stride = 3,
},
// node_geosphere001_scale_intangent
// node_geosphere_scale_intangent
.in_tangent = {
.float_array = array_node_geosphere001_scale_intangent_array,
.float_array = array_node_geosphere_scale_intangent_array,
.count = 3,
.stride = 6,
},
// node_geosphere001_scale_outtangent
// node_geosphere_scale_outtangent
.out_tangent = {
.float_array = array_node_geosphere001_scale_outtangent_array,
.float_array = array_node_geosphere_scale_outtangent_array,
.count = 3,
.stride = 6,
},
// node_geosphere001_scale_interpolation
// node_geosphere_scale_interpolation
.interpolation = {
.interpolation_array = array_node_geosphere001_scale_interpolation_array,
.interpolation_array = array_node_geosphere_scale_interpolation_array,
.count = 3,
.stride = 1,
},
};
float const array_node_geosphere001_inversescaleaxisrotation_input_array[] = {
float const array_node_geosphere_inversescaleaxisrotation_input_array[] = {
0.0f,
1.666667f,
3.333333f,
};
float const array_node_geosphere001_inversescaleaxisrotation_output_array[] = {
float const array_node_geosphere_inversescaleaxisrotation_output_array[] = {
0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f,
};
enum interpolation const array_node_geosphere001_inversescaleaxisrotation_interpolation_array[] = {
enum interpolation const array_node_geosphere_inversescaleaxisrotation_interpolation_array[] = {
interpolation::LINEAR,
interpolation::LINEAR,
interpolation::LINEAR,
};
sampler const sampler_node_geosphere001_inversescaleaxisrotation_sampler = {
// node_geosphere001_inversescaleaxisrotation_input
sampler const sampler_node_geosphere_inversescaleaxisrotation_sampler = {
// node_geosphere_inversescaleaxisrotation_input
.input = {
.float_array = array_node_geosphere001_inversescaleaxisrotation_input_array,
.float_array = array_node_geosphere_inversescaleaxisrotation_input_array,
.count = 3,
.stride = 1,
},
// node_geosphere001_inversescaleaxisrotation_output
// node_geosphere_inversescaleaxisrotation_output
.output = {
.float_array = array_node_geosphere001_inversescaleaxisrotation_output_array,
.float_array = array_node_geosphere_inversescaleaxisrotation_output_array,
.count = 3,
.stride = 4,
},
// node_geosphere001_inversescaleaxisrotation_interpolation
// node_geosphere_inversescaleaxisrotation_interpolation
.interpolation = {
.interpolation_array = array_node_geosphere001_inversescaleaxisrotation_interpolation_array,
.interpolation_array = array_node_geosphere_inversescaleaxisrotation_interpolation_array,
.count = 3,
.stride = 1,
},
};
float const array_node_geosphere001_scaleaxisrotation_input_array[] = {
float const array_node_geosphere_scaleaxisrotation_input_array[] = {
0.0f,
1.666667f,
3.333333f,
};
float const array_node_geosphere001_scaleaxisrotation_output_array[] = {
float const array_node_geosphere_scaleaxisrotation_output_array[] = {
0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f,
};
enum interpolation const array_node_geosphere001_scaleaxisrotation_interpolation_array[] = {
enum interpolation const array_node_geosphere_scaleaxisrotation_interpolation_array[] = {
interpolation::LINEAR,
interpolation::LINEAR,
interpolation::LINEAR,
};
sampler const sampler_node_geosphere001_scaleaxisrotation_sampler = {
// node_geosphere001_scaleaxisrotation_input
sampler const sampler_node_geosphere_scaleaxisrotation_sampler = {
// node_geosphere_scaleaxisrotation_input
.input = {
.float_array = array_node_geosphere001_scaleaxisrotation_input_array,
.float_array = array_node_geosphere_scaleaxisrotation_input_array,
.count = 3,
.stride = 1,
},
// node_geosphere001_scaleaxisrotation_output
// node_geosphere_scaleaxisrotation_output
.output = {
.float_array = array_node_geosphere001_scaleaxisrotation_output_array,
.float_array = array_node_geosphere_scaleaxisrotation_output_array,
.count = 3,
.stride = 4,
},
// node_geosphere001_scaleaxisrotation_interpolation
// node_geosphere_scaleaxisrotation_interpolation
.interpolation = {
.interpolation_array = array_node_geosphere001_scaleaxisrotation_interpolation_array,
.interpolation_array = array_node_geosphere_scaleaxisrotation_interpolation_array,
.count = 3,
.stride = 1,
},
@ -366,27 +376,27 @@ channel const node_channel_node_cube_translation_y = {
.target_attribute = target_attribute::Y,
};
channel const node_channel_node_torus001_rotationx_angle = {
.source_sampler = &sampler_node_torus001_rotationx_angle_sampler,
channel const node_channel_node_torus_rotationx_angle = {
.source_sampler = &sampler_node_torus_rotationx_angle_sampler,
.target_transform_index = 3,
.target_attribute = target_attribute::ANGLE,
};
channel const node_channel_node_geosphere001_scale = {
.source_sampler = &sampler_node_geosphere001_scale_sampler,
.target_transform_index = 2,
.target_attribute = target_attribute::ALL,
};
channel const node_channel_node_geosphere001_inversescaleaxisrotation = {
.source_sampler = &sampler_node_geosphere001_inversescaleaxisrotation_sampler,
channel const node_channel_node_geosphere_scale = {
.source_sampler = &sampler_node_geosphere_scale_sampler,
.target_transform_index = 1,
.target_attribute = target_attribute::ALL,
};
channel const node_channel_node_geosphere001_scaleaxisrotation = {
.source_sampler = &sampler_node_geosphere001_scaleaxisrotation_sampler,
.target_transform_index = 3,
channel const node_channel_node_geosphere_inversescaleaxisrotation = {
.source_sampler = &sampler_node_geosphere_inversescaleaxisrotation_sampler,
.target_transform_index = 0,
.target_attribute = target_attribute::ALL,
};
channel const node_channel_node_geosphere_scaleaxisrotation = {
.source_sampler = &sampler_node_geosphere_scaleaxisrotation_sampler,
.target_transform_index = 2,
.target_attribute = target_attribute::ALL,
};
@ -670,6 +680,34 @@ effect const effect_coloreffectr198g224b87 = {
}
};
effect const effect_lightemit = {
.type = effect_type::BLINN,
.blinn = {
.emission = {
.color = {1.0f, 1.0f, 1.0f, 1.0f},
},
.ambient = {
.color = {0.0f, 0.0f, 0.0f, 1.0f},
},
.diffuse = {
.color = {0.0f, 0.0f, 0.0f, 1.0f},
},
.specular = {
.color = {0.0f, 0.0f, 0.0f, 1.0f},
},
.shininess = 10.0f,
.reflective = {
.color = {0.0f, 0.0f, 0.0f, 1.0f},
},
.reflectivity = 0.0f,
.transparent = {
.color = {1.0f, 1.0f, 1.0f, 1.0f},
},
.transparency = 1.0f,
.index_of_refraction = 0.0f,
}
};
material const material_coloreffectr26g177b26_material = {
.effect = &effect_coloreffectr26g177b26,
};
@ -710,6 +748,10 @@ material const material_material__20_material = {
.effect = &effect_material__20,
};
material const material_lightemit_material = {
.effect = &effect_lightemit,
};
input_element const input_elements_position_0_3_normal_0_3_texcoord_0_3[] = {
{
.semantic = "POSITION",
@ -774,7 +816,7 @@ geometry const geometry_geom_cube = {
}
};
triangles const triangles_geom_torus001[] = {
triangles const triangles_geom_torus[] = {
{
.count = 240, // triangles
.index_offset = 0, // indices
@ -782,9 +824,9 @@ triangles const triangles_geom_torus001[] = {
},
};
geometry const geometry_geom_torus001 = {
geometry const geometry_geom_torus = {
.mesh = {
.triangles = triangles_geom_torus001,
.triangles = triangles_geom_torus,
.triangles_count = 1,
.vertex_buffer_offset = 864,
@ -795,7 +837,7 @@ geometry const geometry_geom_torus001 = {
}
};
triangles const triangles_geom_cylinder001[] = {
triangles const triangles_geom_cylinder[] = {
{
.count = 30, // triangles
.index_offset = 0, // indices
@ -803,9 +845,9 @@ triangles const triangles_geom_cylinder001[] = {
},
};
geometry const geometry_geom_cylinder001 = {
geometry const geometry_geom_cylinder = {
.mesh = {
.triangles = triangles_geom_cylinder001,
.triangles = triangles_geom_cylinder,
.triangles_count = 1,
.vertex_buffer_offset = 6012,
@ -816,7 +858,7 @@ geometry const geometry_geom_cylinder001 = {
}
};
triangles const triangles_geom_plane001[] = {
triangles const triangles_geom_plane[] = {
{
.count = 2, // triangles
.index_offset = 0, // indices
@ -824,9 +866,9 @@ triangles const triangles_geom_plane001[] = {
},
};
geometry const geometry_geom_plane001 = {
geometry const geometry_geom_plane = {
.mesh = {
.triangles = triangles_geom_plane001,
.triangles = triangles_geom_plane,
.triangles_count = 1,
.vertex_buffer_offset = 7164,
@ -837,7 +879,7 @@ geometry const geometry_geom_plane001 = {
}
};
triangles const triangles_geom_geosphere001[] = {
triangles const triangles_geom_geosphere[] = {
{
.count = 40, // triangles
.index_offset = 0, // indices
@ -845,9 +887,9 @@ triangles const triangles_geom_geosphere001[] = {
},
};
geometry const geometry_geom_geosphere001 = {
geometry const geometry_geom_geosphere = {
.mesh = {
.triangles = triangles_geom_geosphere001,
.triangles = triangles_geom_geosphere,
.triangles_count = 1,
.vertex_buffer_offset = 7308,
@ -858,12 +900,34 @@ geometry const geometry_geom_geosphere001 = {
}
};
triangles const triangles_geom_lightindicator[] = {
{
.count = 8, // triangles
.index_offset = 0, // indices
.inputs_index = 0, // index into inputs_list
},
};
geometry const geometry_geom_lightindicator = {
.mesh = {
.triangles = triangles_geom_lightindicator,
.triangles_count = 1,
.vertex_buffer_offset = 11628,
.vertex_buffer_size = 864,
.index_buffer_offset = 3888,
.index_buffer_size = 96,
}
};
geometry const * const geometries[] = {
&geometry_geom_cube,
&geometry_geom_torus001,
&geometry_geom_cylinder001,
&geometry_geom_plane001,
&geometry_geom_geosphere001,
&geometry_geom_torus,
&geometry_geom_cylinder,
&geometry_geom_plane,
&geometry_geom_geosphere,
&geometry_geom_lightindicator,
};
transform const transforms_node_environmentambientlight[] = {
@ -872,6 +936,12 @@ transform const transforms_node_environmentambientlight[] = {
instance_geometry const instance_geometries_node_environmentambientlight[] = {
};
instance_light const instance_lights_node_environmentambientlight[] = {
{
.light = &light_environmentambientlight,
}
};
channel const * const node_channels_node_environmentambientlight[] = {};
node const node_node_environmentambientlight = {
@ -885,6 +955,9 @@ node const node_node_environmentambientlight = {
.instance_geometries = instance_geometries_node_environmentambientlight,
.instance_geometries_count = 0,
.instance_lights = instance_lights_node_environmentambientlight,
.instance_lights_count = 1,
.channels = node_channels_node_environmentambientlight,
.channels_count = 0,
};
@ -931,9 +1004,12 @@ instance_geometry const instance_geometries_node_cube[] = {
},
};
instance_light const instance_lights_node_cube[] = {
};
channel const * const node_channels_node_cube[] = {
&node_channel_node_cube_translation_y,
&node_channel_node_cube_translation_x,
&node_channel_node_cube_translation_y,
};
node const node_node_cube = {
@ -947,11 +1023,14 @@ node const node_node_cube = {
.instance_geometries = instance_geometries_node_cube,
.instance_geometries_count = 1,
.instance_lights = instance_lights_node_cube,
.instance_lights_count = 0,
.channels = node_channels_node_cube,
.channels_count = 2,
};
transform const transforms_node_torus001[] = {
transform const transforms_node_torus[] = {
{
.type = transform_type::TRANSLATE,
.translate = {5.0f, 1.14258e-07f, 2.0f},
@ -974,77 +1053,89 @@ transform const transforms_node_torus001[] = {
},
};
instance_material const instance_materials_node_torus001_0[] = {
instance_material const instance_materials_node_torus_0[] = {
{
.element_index = 0, // an index into mesh.triangles
.material = &material_coloreffectr26g177b26_material,
},
};
instance_geometry const instance_geometries_node_torus001[] = {
instance_geometry const instance_geometries_node_torus[] = {
{
.geometry = &geometry_geom_torus001,
.instance_materials = instance_materials_node_torus001_0,
.geometry = &geometry_geom_torus,
.instance_materials = instance_materials_node_torus_0,
.instance_materials_count = 1,
},
};
channel const * const node_channels_node_torus001[] = {
&node_channel_node_torus001_rotationx_angle,
instance_light const instance_lights_node_torus[] = {
};
node const node_node_torus001 = {
channel const * const node_channels_node_torus[] = {
&node_channel_node_torus_rotationx_angle,
};
node const node_node_torus = {
.parent_index = 1,
.type = node_type::NODE,
.transforms = transforms_node_torus001,
.transforms = transforms_node_torus,
.transforms_count = 5,
.instance_geometries = instance_geometries_node_torus001,
.instance_geometries = instance_geometries_node_torus,
.instance_geometries_count = 1,
.channels = node_channels_node_torus001,
.instance_lights = instance_lights_node_torus,
.instance_lights_count = 0,
.channels = node_channels_node_torus,
.channels_count = 1,
};
transform const transforms_node_cylinder001[] = {
transform const transforms_node_cylinder[] = {
};
instance_material const instance_materials_node_cylinder001_0[] = {
instance_material const instance_materials_node_cylinder_0[] = {
{
.element_index = 0, // an index into mesh.triangles
.material = &material_coloreffectr229g154b215_material,
},
};
instance_geometry const instance_geometries_node_cylinder001[] = {
instance_geometry const instance_geometries_node_cylinder[] = {
{
.geometry = &geometry_geom_cylinder001,
.instance_materials = instance_materials_node_cylinder001_0,
.geometry = &geometry_geom_cylinder,
.instance_materials = instance_materials_node_cylinder_0,
.instance_materials_count = 1,
},
};
channel const * const node_channels_node_cylinder001[] = {
instance_light const instance_lights_node_cylinder[] = {
};
node const node_node_cylinder001 = {
channel const * const node_channels_node_cylinder[] = {
};
node const node_node_cylinder = {
.parent_index = -1,
.type = node_type::NODE,
.transforms = transforms_node_cylinder001,
.transforms = transforms_node_cylinder,
.transforms_count = 0,
.instance_geometries = instance_geometries_node_cylinder001,
.instance_geometries = instance_geometries_node_cylinder,
.instance_geometries_count = 1,
.channels = node_channels_node_cylinder001,
.instance_lights = instance_lights_node_cylinder,
.instance_lights_count = 0,
.channels = node_channels_node_cylinder,
.channels_count = 0,
};
transform const transforms_node_plane001[] = {
transform const transforms_node_plane[] = {
{
.type = transform_type::TRANSLATE,
.translate = {0.0f, 0.0f, 0.01f},
@ -1055,44 +1146,46 @@ transform const transforms_node_plane001[] = {
},
};
instance_material const instance_materials_node_plane001_0[] = {
instance_material const instance_materials_node_plane_0[] = {
{
.element_index = 0, // an index into mesh.triangles
.material = &material_coloreffectr28g149b177_material,
},
};
instance_geometry const instance_geometries_node_plane001[] = {
instance_geometry const instance_geometries_node_plane[] = {
{
.geometry = &geometry_geom_plane001,
.instance_materials = instance_materials_node_plane001_0,
.geometry = &geometry_geom_plane,
.instance_materials = instance_materials_node_plane_0,
.instance_materials_count = 1,
},
};
channel const * const node_channels_node_plane001[] = {
instance_light const instance_lights_node_plane[] = {
};
node const node_node_plane001 = {
channel const * const node_channels_node_plane[] = {
};
node const node_node_plane = {
.parent_index = -1,
.type = node_type::NODE,
.transforms = transforms_node_plane001,
.transforms = transforms_node_plane,
.transforms_count = 2,
.instance_geometries = instance_geometries_node_plane001,
.instance_geometries = instance_geometries_node_plane,
.instance_geometries_count = 1,
.channels = node_channels_node_plane001,
.instance_lights = instance_lights_node_plane,
.instance_lights_count = 0,
.channels = node_channels_node_plane,
.channels_count = 0,
};
transform const transforms_node_geosphere001[] = {
{
.type = transform_type::TRANSLATE,
.translate = {0.03164387f, -0.03838623f, 0.0f},
},
transform const transforms_node_geosphere[] = {
{
.type = transform_type::ROTATE,
.rotate = {0.0f, 0.0f, 0.0f, 0.0f},
@ -1107,49 +1200,140 @@ transform const transforms_node_geosphere001[] = {
},
};
instance_material const instance_materials_node_geosphere001_0[] = {
instance_material const instance_materials_node_geosphere_0[] = {
{
.element_index = 0, // an index into mesh.triangles
.material = &material_coloreffectr198g224b87_material,
},
};
instance_geometry const instance_geometries_node_geosphere001[] = {
instance_geometry const instance_geometries_node_geosphere[] = {
{
.geometry = &geometry_geom_geosphere001,
.instance_materials = instance_materials_node_geosphere001_0,
.geometry = &geometry_geom_geosphere,
.instance_materials = instance_materials_node_geosphere_0,
.instance_materials_count = 1,
},
};
channel const * const node_channels_node_geosphere001[] = {
&node_channel_node_geosphere001_inversescaleaxisrotation,
&node_channel_node_geosphere001_scale,
&node_channel_node_geosphere001_scaleaxisrotation,
instance_light const instance_lights_node_geosphere[] = {
};
node const node_node_geosphere001 = {
channel const * const node_channels_node_geosphere[] = {
&node_channel_node_geosphere_scale,
&node_channel_node_geosphere_inversescaleaxisrotation,
&node_channel_node_geosphere_scaleaxisrotation,
};
node const node_node_geosphere = {
.parent_index = -1,
.type = node_type::NODE,
.transforms = transforms_node_geosphere001,
.transforms_count = 4,
.transforms = transforms_node_geosphere,
.transforms_count = 3,
.instance_geometries = instance_geometries_node_geosphere001,
.instance_geometries = instance_geometries_node_geosphere,
.instance_geometries_count = 1,
.channels = node_channels_node_geosphere001,
.instance_lights = instance_lights_node_geosphere,
.instance_lights_count = 0,
.channels = node_channels_node_geosphere,
.channels_count = 3,
};
transform const transforms_node_light[] = {
{
.type = transform_type::TRANSLATE,
.translate = {2.124535f, 8.291501f, 6.185831f},
},
};
instance_geometry const instance_geometries_node_light[] = {
};
instance_light const instance_lights_node_light[] = {
{
.light = &light_light_light,
}
};
channel const * const node_channels_node_light[] = {
};
node const node_node_light = {
.parent_index = -1,
.type = node_type::NODE,
.transforms = transforms_node_light,
.transforms_count = 1,
.instance_geometries = instance_geometries_node_light,
.instance_geometries_count = 0,
.instance_lights = instance_lights_node_light,
.instance_lights_count = 1,
.channels = node_channels_node_light,
.channels_count = 0,
};
transform const transforms_node_lightindicator[] = {
{
.type = transform_type::ROTATE,
.rotate = {0.5773504f, -0.5773501f, -0.5773504f, -120.0f},
},
};
instance_material const instance_materials_node_lightindicator_0[] = {
{
.element_index = 0, // an index into mesh.triangles
.material = &material_lightemit_material,
},
};
instance_geometry const instance_geometries_node_lightindicator[] = {
{
.geometry = &geometry_geom_lightindicator,
.instance_materials = instance_materials_node_lightindicator_0,
.instance_materials_count = 1,
},
};
instance_light const instance_lights_node_lightindicator[] = {
};
channel const * const node_channels_node_lightindicator[] = {
};
node const node_node_lightindicator = {
.parent_index = 6,
.type = node_type::NODE,
.transforms = transforms_node_lightindicator,
.transforms_count = 1,
.instance_geometries = instance_geometries_node_lightindicator,
.instance_geometries_count = 1,
.instance_lights = instance_lights_node_lightindicator,
.instance_lights_count = 0,
.channels = node_channels_node_lightindicator,
.channels_count = 0,
};
node const * const nodes[] = {
&node_node_environmentambientlight,
&node_node_cube,
&node_node_torus001,
&node_node_cylinder001,
&node_node_plane001,
&node_node_geosphere001,
&node_node_torus,
&node_node_cylinder,
&node_node_plane,
&node_node_geosphere,
&node_node_light,
&node_node_lightindicator,
};
inputs const inputs_list[] = {