diff --git a/data/materials/DefaultMaterial.material b/data/materials/DefaultMaterial.material new file mode 100644 index 0000000..c88f3b7 --- /dev/null +++ b/data/materials/DefaultMaterial.material @@ -0,0 +1 @@ +{"color":{"asset_value":"","float_value":0.0,"name":"","type":0,"value":{"x":0.6000000238418579,"y":0.6000000238418579,"z":0.6000000238418579}},"version":3} \ No newline at end of file diff --git a/data/materials/kamen_zid.material b/data/materials/kamen_zid.material new file mode 100644 index 0000000..2559bb8 --- /dev/null +++ b/data/materials/kamen_zid.material @@ -0,0 +1 @@ +{"color":{"asset_value":"textures/kamen.png","float_value":0.0,"name":"","type":2,"value":{"x":0.7341179847717285,"y":0.7305880188941956,"z":0.6741179823875427}},"version":3} \ No newline at end of file diff --git a/data/materials/kamen_zid_parapet.material b/data/materials/kamen_zid_parapet.material new file mode 100644 index 0000000..3c4fdde --- /dev/null +++ b/data/materials/kamen_zid_parapet.material @@ -0,0 +1 @@ +{"color":{"asset_value":"textures/KAMEN-stup.png","float_value":0.0,"name":"","type":2,"value":{"x":0.7341179847717285,"y":0.7305880188941956,"z":0.6741179823875427}},"version":3} \ No newline at end of file diff --git a/data/materials/kamen_zid_prozor.material b/data/materials/kamen_zid_prozor.material new file mode 100644 index 0000000..2559bb8 --- /dev/null +++ b/data/materials/kamen_zid_prozor.material @@ -0,0 +1 @@ +{"color":{"asset_value":"textures/kamen.png","float_value":0.0,"name":"","type":2,"value":{"x":0.7341179847717285,"y":0.7305880188941956,"z":0.6741179823875427}},"version":3} \ No newline at end of file diff --git a/data/materials/pod.material b/data/materials/pod.material new file mode 100644 index 0000000..34b1dc6 --- /dev/null +++ b/data/materials/pod.material @@ -0,0 +1 @@ +{"color":{"asset_value":"textures/mramor6x6.png","float_value":0.0,"name":"","type":2,"value":{"x":0.7341179847717285,"y":0.7094119787216187,"z":0.6741179823875427}},"version":3} \ No newline at end of file diff --git a/data/materials/pod_rub.material b/data/materials/pod_rub.material new file mode 100644 index 0000000..2559bb8 --- /dev/null +++ b/data/materials/pod_rub.material @@ -0,0 +1 @@ +{"color":{"asset_value":"textures/kamen.png","float_value":0.0,"name":"","type":2,"value":{"x":0.7341179847717285,"y":0.7305880188941956,"z":0.6741179823875427}},"version":3} \ No newline at end of file diff --git a/data/materials/pod_tepih.material b/data/materials/pod_tepih.material new file mode 100644 index 0000000..0b70b5c --- /dev/null +++ b/data/materials/pod_tepih.material @@ -0,0 +1 @@ +{"color":{"asset_value":"","float_value":0.0,"name":"","type":0,"value":{"x":1.0,"y":0.11999999731779099,"z":0.10000000149011612}},"version":3} \ No newline at end of file diff --git a/data/materials/rozeta.material b/data/materials/rozeta.material new file mode 100644 index 0000000..3c4fdde --- /dev/null +++ b/data/materials/rozeta.material @@ -0,0 +1 @@ +{"color":{"asset_value":"textures/KAMEN-stup.png","float_value":0.0,"name":"","type":2,"value":{"x":0.7341179847717285,"y":0.7305880188941956,"z":0.6741179823875427}},"version":3} \ No newline at end of file diff --git a/data/materials/sprljci.material b/data/materials/sprljci.material new file mode 100644 index 0000000..d1fcd3a --- /dev/null +++ b/data/materials/sprljci.material @@ -0,0 +1 @@ +{"color":{"asset_value":"","float_value":0.0,"name":"","type":0,"value":{"x":0.784313976764679,"y":0.784313976764679,"z":0.784313976764679}},"version":3} \ No newline at end of file diff --git a/data/materials/staklo.material b/data/materials/staklo.material new file mode 100644 index 0000000..09741dc --- /dev/null +++ b/data/materials/staklo.material @@ -0,0 +1 @@ +{"color":{"asset_value":"","float_value":0.0,"name":"","type":0,"value":{"x":0.0,"y":0.0,"z":0.0}},"version":3} \ No newline at end of file diff --git a/data/materials/staklo_crveno.material b/data/materials/staklo_crveno.material new file mode 100644 index 0000000..b8f7dd4 --- /dev/null +++ b/data/materials/staklo_crveno.material @@ -0,0 +1 @@ +{"color":{"asset_value":"","float_value":0.0,"name":"","type":0,"value":{"x":0.44117599725723267,"y":0.10392200201749802,"z":0.04901999980211258}},"version":3} \ No newline at end of file diff --git a/data/materials/staklo_plavo.material b/data/materials/staklo_plavo.material new file mode 100644 index 0000000..09741dc --- /dev/null +++ b/data/materials/staklo_plavo.material @@ -0,0 +1 @@ +{"color":{"asset_value":"","float_value":0.0,"name":"","type":0,"value":{"x":0.0,"y":0.0,"z":0.0}},"version":3} \ No newline at end of file diff --git a/data/materials/staklo_zeleno.material b/data/materials/staklo_zeleno.material new file mode 100644 index 0000000..09741dc --- /dev/null +++ b/data/materials/staklo_zeleno.material @@ -0,0 +1 @@ +{"color":{"asset_value":"","float_value":0.0,"name":"","type":0,"value":{"x":0.0,"y":0.0,"z":0.0}},"version":3} \ No newline at end of file diff --git a/data/materials/staklo_zuto.material b/data/materials/staklo_zuto.material new file mode 100644 index 0000000..09741dc --- /dev/null +++ b/data/materials/staklo_zuto.material @@ -0,0 +1 @@ +{"color":{"asset_value":"","float_value":0.0,"name":"","type":0,"value":{"x":0.0,"y":0.0,"z":0.0}},"version":3} \ No newline at end of file diff --git a/data/materials/stupovi.material b/data/materials/stupovi.material new file mode 100644 index 0000000..3c4fdde --- /dev/null +++ b/data/materials/stupovi.material @@ -0,0 +1 @@ +{"color":{"asset_value":"textures/KAMEN-stup.png","float_value":0.0,"name":"","type":2,"value":{"x":0.7341179847717285,"y":0.7305880188941956,"z":0.6741179823875427}},"version":3} \ No newline at end of file diff --git a/data/materials/zid_vani.material b/data/materials/zid_vani.material new file mode 100644 index 0000000..2559bb8 --- /dev/null +++ b/data/materials/zid_vani.material @@ -0,0 +1 @@ +{"color":{"asset_value":"textures/kamen.png","float_value":0.0,"name":"","type":2,"value":{"x":0.7341179847717285,"y":0.7305880188941956,"z":0.6741179823875427}},"version":3} \ No newline at end of file diff --git a/data/models/sibenik.model b/data/models/sibenik.model new file mode 100644 index 0000000..ec293be Binary files /dev/null and b/data/models/sibenik.model differ diff --git a/data/sibenik-license.txt b/data/sibenik-license.txt new file mode 100644 index 0000000..3ffe5d2 --- /dev/null +++ b/data/sibenik-license.txt @@ -0,0 +1,4 @@ +The Sibenik model bundled with this program is licensed under CC BY-NC. Original copyright © 2002 Marko Dabrovic. + +Sourced from: + Morgan McGuire, Computer Graphics Archive, July 2017 (https://casual-effects.com/data) diff --git a/data/textures/KAMEN-stup.png b/data/textures/KAMEN-stup.png new file mode 100644 index 0000000..1c63a9f Binary files /dev/null and b/data/textures/KAMEN-stup.png differ diff --git a/data/textures/kamen-bump.png b/data/textures/kamen-bump.png new file mode 100644 index 0000000..f9f89ff Binary files /dev/null and b/data/textures/kamen-bump.png differ diff --git a/data/textures/kamen.png b/data/textures/kamen.png new file mode 100644 index 0000000..0cb08ba Binary files /dev/null and b/data/textures/kamen.png differ diff --git a/data/textures/mramor6x6-bump.png b/data/textures/mramor6x6-bump.png new file mode 100644 index 0000000..9369416 Binary files /dev/null and b/data/textures/mramor6x6-bump.png differ diff --git a/data/textures/mramor6x6.png b/data/textures/mramor6x6.png new file mode 100644 index 0000000..981ee99 Binary files /dev/null and b/data/textures/mramor6x6.png differ diff --git a/engine/asset/include/asset_types.hpp b/engine/asset/include/asset_types.hpp index 8272730..da85ba4 100644 --- a/engine/asset/include/asset_types.hpp +++ b/engine/asset/include/asset_types.hpp @@ -83,6 +83,7 @@ public: uint32_t index_offset = 0, vertex_offset = 0, index_count = 0; int32_t material_override = -1; + std::string material_hint; }; std::vector parts; diff --git a/engine/asset/src/asset.cpp b/engine/asset/src/asset.cpp index 780e91f..b3b5ac4 100644 --- a/engine/asset/src/asset.cpp +++ b/engine/asset/src/asset.cpp @@ -27,7 +27,7 @@ std::unique_ptr load_mesh(const prism::path path) { int version = 0; file->read(&version); - if(version == 5 || version == 6) { + if(version == 5 || version == 6 || version == 7) { } else { prism::log("{} failed the mesh version check! reported version = {}", path.string(), version); return nullptr; @@ -51,7 +51,7 @@ std::unique_ptr load_mesh(const prism::path path) { const auto read_buffer = [&f = file.value(), numVertices](unsigned int size) -> GFXBuffer* { auto buffer = engine->get_gfx()->create_buffer(nullptr, size * static_cast(numVertices), false, GFXBufferUsage::Vertex); - auto buffer_ptr = reinterpret_cast(engine->get_gfx()->get_buffer_contents(buffer)); + auto buffer_ptr = reinterpret_cast(engine->get_gfx()->get_buffer_contents(buffer)); f.read(buffer_ptr, size * static_cast(numVertices)); @@ -154,7 +154,7 @@ std::unique_ptr load_mesh(const prism::path path) { file->read_string(p.name); - if(version == 6) { + if(version >= 6) { file->read(&p.bounding_box); } @@ -176,6 +176,10 @@ std::unique_ptr load_mesh(const prism::path path) { file->read(&p.material_override); + if(version == 7) { + file->read_string(p.material_hint); + } + vertexOffset += numVerts; indexOffset += p.index_count; } @@ -265,6 +269,7 @@ std::unique_ptr load_material(const prism::path path) { auto property = j["color"]; mat->colorProperty.value = property["value"]; mat->colorProperty.float_value = property["float_value"]; + mat->colorProperty.type = property["type"]; if(!property["asset_value"].get().empty()) { mat->colorProperty.value_tex = assetm->get(prism::app_domain / property["asset_value"].get()); @@ -285,6 +290,7 @@ void save_material(Material* material, const prism::path path) { p["value"] = material->colorProperty.value; p["asset_value"] = material->colorProperty.value_tex ? material->colorProperty.value_tex->path : ""; p["float_value"] = material->colorProperty.float_value; + p["type"] = material->colorProperty.type; j["color"] = p; diff --git a/example/src/example.cpp b/example/src/example.cpp index 16a9c16..1ee146a 100644 --- a/example/src/example.cpp +++ b/example/src/example.cpp @@ -24,15 +24,30 @@ void ExampleApp::initialize_render() { auto sun_obj = scene->add_object(); auto& sun = scene->add(sun_obj); - sun.type = Light::Type::Sun; + sun.type = Light::Type::Point; auto& sun_trans = scene->get(sun_obj); - sun_trans.position = {5, 5, 5}; + sun_trans.position = {0, 5, -3}; + + auto second_sun_obj = scene->add_object(); + auto& second_sun = scene->add(second_sun_obj); + second_sun.type = Light::Type::Point; + second_sun.color = {1, 0, 0}; + scene->get(second_sun_obj).position = {2, 3, 3}; auto sphere_obj = scene->add_object(); auto& sphere_render = scene->add(sphere_obj); sphere_render.mesh = assetm->get(prism::path(prism::app_domain / "models/sphere.model")); sphere_render.materials = { assetm->get(prism::path(prism::app_domain / "materials/Material.material")) }; + auto sibenik_obj = scene->add_object(); + auto& sibenik_render = scene->add(sibenik_obj); + sibenik_render.mesh = assetm->get(prism::path(prism::app_domain / "models/sibenik.model")); + scene->get(sibenik_obj).position.y = 13.5; + + for(auto& part : sibenik_render.mesh->parts) { + sibenik_render.materials.push_back(assetm->get(prism::path(prism::app_domain / "materials" / (part.material_hint + ".material")))); + } + auto probe_obj = scene->add_object(); - scene->add(probe_obj); + scene->add(probe_obj).is_sized = false; } \ No newline at end of file diff --git a/tools/modelcompiler/src/modeleditor.cpp b/tools/modelcompiler/src/modeleditor.cpp index bfceade..a27c6cc 100755 --- a/tools/modelcompiler/src/modeleditor.cpp +++ b/tools/modelcompiler/src/modeleditor.cpp @@ -141,7 +141,20 @@ aiVector3D getBoneScale(const aiScene* scene, const aiBone* bone) { void write_string(FILE* file, const aiString& str) { fwrite(&str.length, sizeof(unsigned int), 1, file); - fwrite(str.C_Str(), sizeof(char) * str.length, 1, file); + if(str.length > 0) { + fwrite(str.C_Str(), sizeof(char) * str.length, 1, file); + prism::log("writing string {}", str.C_Str()); + } +} + +void write_string(FILE* file, const std::string& str) { + unsigned int len = str.length(); + fwrite(&len, sizeof(unsigned int), 1, file); + + if(str.length() > 0) { + fwrite(str.c_str(), sizeof(char) * len, 1, file); + prism::log("writing string {}", str.c_str()); + } } void ModelEditor::compile_model() { @@ -196,7 +209,7 @@ void ModelEditor::compile_model() { FILE* file = fopen((data_path + "/models/" + name + ".model").c_str(), "wb"); - int version = 6; + int version = 7; fwrite(&version, sizeof(int), 1, file); std::vector meshToMaterial; @@ -299,11 +312,11 @@ void ModelEditor::compile_model() { } }; - write_buffer(positions, sizeof(aiVector3D)); - write_buffer(normals, sizeof(aiVector3D)); - write_buffer(texture_coords, sizeof(aiVector2D)); - write_buffer(tangents, sizeof(aiVector3D)); - write_buffer(bitangents, sizeof(aiVector3D)); + write_buffer(positions, sizeof(prism::float3)); + write_buffer(normals, sizeof(prism::float3)); + write_buffer(texture_coords, sizeof(prism::float2)); + write_buffer(tangents, sizeof(prism::float3)); + write_buffer(bitangents, sizeof(prism::float3)); if(mesh_type == MeshType::Skinned) write_buffer(bone_vertex_data, sizeof(BoneVertexData)); @@ -397,6 +410,8 @@ void ModelEditor::compile_model() { int material_override = matNameToIndex[meshToMaterial[i]]; fwrite(&material_override, sizeof(int), 1, file); + + write_string(file, meshToMaterial[i]); } fclose(file); @@ -405,11 +420,6 @@ void ModelEditor::compile_model() { for(int i = 0; i < sc->mNumMaterials; i++) { auto path = data_path + "/materials/" + sc->mMaterials[i]->GetName().C_Str() + ".material"; - // skip materials that already exist - std::ifstream infile(path); - if(infile.good()) - continue; - Material mat; aiColor4D color; @@ -422,7 +432,8 @@ void ModelEditor::compile_model() { if(aiReturn_SUCCESS == aiGetMaterialTexture(sc->mMaterials[i], aiTextureType_DIFFUSE, 0, &diffuse_path)) { mat.colorProperty.type = DataType::AssetTexture; mat.colorProperty.value_tex.handle = new Texture(); - mat.colorProperty.value_tex->path = diffuse_path.C_Str(); + mat.colorProperty.value_tex->path = std::string("textures/") + diffuse_path.C_Str(); + mat.colorProperty.type = DataType::AssetTexture; } save_material(&mat, path);