From ad14c471eb2525c2ae70cef3a7e4555dbf7ce3f3 Mon Sep 17 00:00:00 2001 From: Lukas Stockner Date: Thu, 19 May 2016 11:35:50 +0200 Subject: Cycles: Add XML parsing of MappingNodes to Cycles Standalone Reviewers: dingto, sergey Differential Revision: https://developer.blender.org/D2009 --- intern/cycles/app/cycles_xml.cpp | 37 ++++++++++++++++++++++++++++++++++++- intern/cycles/render/nodes.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ intern/cycles/render/nodes.h | 3 +++ 3 files changed, 79 insertions(+), 1 deletion(-) diff --git a/intern/cycles/app/cycles_xml.cpp b/intern/cycles/app/cycles_xml.cpp index 6b0ef3275f3..ab081a7edfe 100644 --- a/intern/cycles/app/cycles_xml.cpp +++ b/intern/cycles/app/cycles_xml.cpp @@ -230,6 +230,24 @@ static bool xml_read_enum(ustring *str, ShaderEnum& enm, pugi::xml_node node, co return false; } +static bool xml_read_enum_value(int *value, ShaderEnum& enm, pugi::xml_node node, const char *name) +{ + pugi::xml_attribute attr = node.attribute(name); + + if(attr) { + ustring ustr(attr.value()); + + if(enm.exists(ustr)) { + *value = enm[ustr]; + return true; + } + else + fprintf(stderr, "Unknown value \"%s\" for attribute \"%s\".\n", ustr.c_str(), name); + } + + return false; +} + static ShaderSocketType xml_read_socket_type(pugi::xml_node node, const char *name) { pugi::xml_attribute attr = node.attribute(name); @@ -529,7 +547,24 @@ static void xml_read_shader_graph(const XMLReadState& state, Shader *shader, pug snode = bump; } else if(string_iequals(node.name(), "mapping")) { - snode = new MappingNode(); + MappingNode *map = new MappingNode(); + + TextureMapping *texmap = &map->tex_mapping; + xml_read_enum_value((int*) &texmap->type, TextureMapping::type_enum, node, "type"); + xml_read_enum_value((int*) &texmap->projection, TextureMapping::projection_enum, node, "projection"); + xml_read_enum_value((int*) &texmap->x_mapping, TextureMapping::mapping_enum, node, "x_mapping"); + xml_read_enum_value((int*) &texmap->y_mapping, TextureMapping::mapping_enum, node, "y_mapping"); + xml_read_enum_value((int*) &texmap->z_mapping, TextureMapping::mapping_enum, node, "z_mapping"); + xml_read_bool(&texmap->use_minmax, node, "use_minmax"); + if(texmap->use_minmax) { + xml_read_float3(&texmap->min, node, "min"); + xml_read_float3(&texmap->max, node, "max"); + } + xml_read_float3(&texmap->translation, node, "translation"); + xml_read_float3(&texmap->rotation, node, "rotation"); + xml_read_float3(&texmap->scale, node, "scale"); + + snode = map; } else if(string_iequals(node.name(), "anisotropic_bsdf")) { AnisotropicBsdfNode *aniso = new AnisotropicBsdfNode(); diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp index 194723e3641..b14363d0767 100644 --- a/intern/cycles/render/nodes.cpp +++ b/intern/cycles/render/nodes.cpp @@ -30,6 +30,46 @@ CCL_NAMESPACE_BEGIN /* Texture Mapping */ +static ShaderEnum texture_mapping_type_init() +{ + ShaderEnum enm; + + enm.insert("Point", TextureMapping::POINT); + enm.insert("Texture", TextureMapping::TEXTURE); + enm.insert("Vector", TextureMapping::VECTOR); + enm.insert("Normal", TextureMapping::NORMAL); + + return enm; +} + +static ShaderEnum texture_mapping_mapping_init() +{ + ShaderEnum enm; + + enm.insert("None", TextureMapping::NONE); + enm.insert("X", TextureMapping::X); + enm.insert("Y", TextureMapping::Y); + enm.insert("Z", TextureMapping::Z); + + return enm; +} + +static ShaderEnum texture_mapping_projection_init() +{ + ShaderEnum enm; + + enm.insert("Flat", TextureMapping::FLAT); + enm.insert("Cube", TextureMapping::CUBE); + enm.insert("Tube", TextureMapping::TUBE); + enm.insert("Sphere", TextureMapping::SPHERE); + + return enm; +} + +ShaderEnum TextureMapping::type_enum = texture_mapping_type_init(); +ShaderEnum TextureMapping::mapping_enum = texture_mapping_mapping_init(); +ShaderEnum TextureMapping::projection_enum = texture_mapping_projection_init(); + TextureMapping::TextureMapping() { translation = make_float3(0.0f, 0.0f, 0.0f); diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h index 8d3e2a58200..40fda070ec4 100644 --- a/intern/cycles/render/nodes.h +++ b/intern/cycles/render/nodes.h @@ -49,12 +49,15 @@ public: enum Type { POINT = 0, TEXTURE = 1, VECTOR = 2, NORMAL = 3 }; Type type; + static ShaderEnum type_enum; enum Mapping { NONE = 0, X = 1, Y = 2, Z = 3 }; Mapping x_mapping, y_mapping, z_mapping; + static ShaderEnum mapping_enum; enum Projection { FLAT, CUBE, TUBE, SPHERE }; Projection projection; + static ShaderEnum projection_enum; bool equals(const TextureMapping& other) { return translation == other.translation && -- cgit v1.2.3