From 5594d2ba5ed0dbd5c376cd5f7ec6c8ab8f39e16e Mon Sep 17 00:00:00 2001 From: Wenzel Jakob Date: Sun, 14 Nov 2010 18:24:12 +0100 Subject: [PATCH] composite material support --- tools/blender/mitsuba/core/__init__.py | 8 ++- tools/blender/mitsuba/properties/material.py | 69 +++++++++++++++++-- .../blender/mitsuba/ui/materials/composite.py | 30 ++++++++ 3 files changed, 100 insertions(+), 7 deletions(-) create mode 100644 tools/blender/mitsuba/ui/materials/composite.py diff --git a/tools/blender/mitsuba/core/__init__.py b/tools/blender/mitsuba/core/__init__.py index 9a084b98..94cea72b 100644 --- a/tools/blender/mitsuba/core/__init__.py +++ b/tools/blender/mitsuba/core/__init__.py @@ -36,7 +36,8 @@ from mitsuba.properties.material import mitsuba_material, \ mitsuba_mat_lambertian, mitsuba_mat_phong, mitsuba_mat_ward, \ mitsuba_mat_microfacet, mitsuba_mat_roughglass, \ mitsuba_mat_roughmetal, mitsuba_mat_dielectric, \ - mitsuba_mat_mirror, mitsuba_mat_difftrans + mitsuba_mat_mirror, mitsuba_mat_difftrans, \ + mitsuba_mat_composite from mitsuba.operators import MITSUBA_OT_preset_engine_add, EXPORT_OT_mitsuba from mitsuba.outputs import MtsLog, MtsFilmDisplay from mitsuba.export.film import resolution @@ -48,7 +49,7 @@ from mitsuba.ui.textures import main, ldrtexture, checkerboard, \ from mitsuba.ui.materials import MATERIAL_PT_context_material_mts from mitsuba.ui.materials import main, lambertian, phong, ward, \ microfacet, roughglass, roughmetal, dielectric, \ - mirror, difftrans + mirror, difftrans, composite def compatible(mod): mod = __import__(mod) @@ -93,7 +94,8 @@ class RENDERENGINE_mitsuba(bpy.types.RenderEngine, engine_base): ('mitsuba_material', mitsuba_mat_roughmetal), ('mitsuba_material', mitsuba_mat_dielectric), ('mitsuba_material', mitsuba_mat_difftrans), - ('mitsuba_material', mitsuba_mat_mirror) + ('mitsuba_material', mitsuba_mat_mirror), + ('mitsuba_material', mitsuba_mat_composite) ] render_lock = threading.Lock() diff --git a/tools/blender/mitsuba/properties/material.py b/tools/blender/mitsuba/properties/material.py index 14c29432..ecaed85b 100644 --- a/tools/blender/mitsuba/properties/material.py +++ b/tools/blender/mitsuba/properties/material.py @@ -50,7 +50,8 @@ class mitsuba_material(declarative_property_group): ('roughglass', 'Rough glass', 'Rough dielectric material (e.g. sand-blasted glass)'), ('roughmetal', 'Rough metal', 'Rough conductor (e.g. sand-blasted metal)'), ('difftrans', 'Diffuse transmitter', 'Material with an ideally diffuse transmittance'), - ('microfacet', 'Microfacet', 'Microfacet material (like the rough glass material, but without transmittance)') + ('microfacet', 'Microfacet', 'Microfacet material (like the rough glass material, but without transmittance)'), + ('composite', 'Compound material', 'Allows creating mixtures of different materials') ], 'save_in_preset': True } @@ -459,7 +460,7 @@ class mitsuba_mat_dielectric(declarative_property_group): class mitsuba_mat_mirror(declarative_property_group): controls = [ - 'specularReflectance', + 'specularReflectance' ] properties = [ @@ -483,7 +484,7 @@ class mitsuba_mat_mirror(declarative_property_group): class mitsuba_mat_difftrans(declarative_property_group): controls = [ - 'transmittance', + 'transmittance' ] properties = [ @@ -491,7 +492,7 @@ class mitsuba_mat_difftrans(declarative_property_group): 'attr': 'transmittance', 'type': 'float_vector', 'subtype': 'COLOR', - 'description' : 'Diffuse transmittance value', + 'description' : 'Amount of ideal diffuse transmittance through the surface', 'name' : 'Diffuse transmittance', 'default' : (0.5, 0.5, 0.5), 'min': 0.0, @@ -504,3 +505,63 @@ class mitsuba_mat_difftrans(declarative_property_group): params = ParamSet() params.add_color('transmittance', self.transmittance) return params + +class WeightedMaterialParameter: + def __init__(self, name, readableName, propertyGroup): + self.name = name + self.readableName = readableName + self.propertyGroup = propertyGroup + + def get_controls(self): + return [ ['%s_material' % self.name, .8, '%s_weight' % self.name ]] + + def get_properties(self): + return [ + { + 'attr': '%s_name' % self.name, + 'type': 'string', + 'name': '%s material name' % self.name, + 'save_in_preset': True + }, + { + 'attr': '%s_weight' % self.name, + 'type': 'float', + 'name': 'Weight', + 'min': 0.0, + 'max': 1.0, + 'default' : 0.0, + 'save_in_preset': True + }, + { + 'attr': '%s_material' % self.name, + 'type': 'prop_search', + 'src': lambda s, c: s.object, + 'src_attr': 'material_slots', + 'trg': lambda s,c: getattr(c, self.propertyGroup), + 'trg_attr': '%s_name' % self.name, + 'name': '%s:' % self.readableName + } + ] + + +param_mat = [] +for i in range(0, 6): + param_mat.append(WeightedMaterialParameter("mat%i" % i, "Material %i" % i, "mitsuba_mat_composite")); + +class mitsuba_mat_composite(declarative_property_group): + controls = [ + 'nElements' + ] + sum(map(lambda x: x.get_controls(), param_mat), []) + + properties = [ + { + 'attr': 'nElements', + 'type': 'int', + 'name' : 'Components', + 'description' : 'Number of mixture components', + 'default' : 2, + 'min': 2, + 'max': 5, + 'save_in_preset': True + } + ] + sum(map(lambda x: x.get_properties(), param_mat), []) diff --git a/tools/blender/mitsuba/ui/materials/composite.py b/tools/blender/mitsuba/ui/materials/composite.py new file mode 100644 index 00000000..56a819b0 --- /dev/null +++ b/tools/blender/mitsuba/ui/materials/composite.py @@ -0,0 +1,30 @@ +# ##### BEGIN GPL LICENSE BLOCK ##### +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# +# ##### END GPL LICENSE BLOCK ##### + +import bpy + +from mitsuba.ui.materials import mitsuba_material_sub + +class ui_material_composite(mitsuba_material_sub, bpy.types.Panel): + bl_label = 'Mitsuba Composite Material' + + MTS_COMPAT = {'composite'} + + display_property_groups = [ + ( ('material', 'mitsuba_material'), 'mitsuba_mat_composite' ) + ]