diff options
author | Dalai Felinto <dfelinto@gmail.com> | 2015-09-24 18:24:20 +0300 |
---|---|---|
committer | Dalai Felinto <dfelinto@gmail.com> | 2015-09-24 18:24:20 +0300 |
commit | 27b3ea622f8bd313a8e2827dfec752bf2125566c (patch) | |
tree | f212e49d224ce8e1cfc3b17a64ae524711494391 /source/gameengine/Ketsji/KX_BlenderMaterial.cpp | |
parent | 372dff8d1dc7e24d4b2cd37de245588ecfce8bfa (diff) | |
parent | de80e687689032cb85179a1f7e89750573631d5d (diff) |
Merge remote-tracking branch 'origin/master' into cycles_camera_nodescycles_camera_nodes
Note: the branch currently crashes in blender_camera_nodes.cpp:
BL::NodeTree b_ntree = b_data.node_groups[nodes_tree_name];
The crash was introduced in:
cb7cf523e5c000609f32a382e2c0fcc57f635a42
Conflicts:
intern/cycles/SConscript
intern/cycles/blender/addon/__init__.py
intern/cycles/blender/addon/properties.py
intern/cycles/blender/blender_camera.cpp
intern/cycles/kernel/kernel_types.h
intern/cycles/kernel/svm/svm.h
intern/cycles/kernel/svm/svm_types.h
intern/cycles/render/camera.cpp
intern/cycles/render/camera.h
Diffstat (limited to 'source/gameengine/Ketsji/KX_BlenderMaterial.cpp')
-rw-r--r-- | source/gameengine/Ketsji/KX_BlenderMaterial.cpp | 345 |
1 files changed, 330 insertions, 15 deletions
diff --git a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp index 9ebdfea6156..d85d33d9834 100644 --- a/source/gameengine/Ketsji/KX_BlenderMaterial.cpp +++ b/source/gameengine/Ketsji/KX_BlenderMaterial.cpp @@ -22,7 +22,7 @@ * \ingroup ketsji */ -#include "GL/glew.h" +#include "glew-mx.h" #include "KX_BlenderMaterial.h" #include "BL_Material.h" @@ -30,6 +30,7 @@ #include "KX_Light.h" #include "KX_GameObject.h" #include "KX_MeshProxy.h" +#include "KX_PyMath.h" #include "MT_Vector3.h" #include "MT_Vector4.h" @@ -52,6 +53,7 @@ #include "BKE_mesh.h" // ------------------------------------ #include "BLI_utildefines.h" +#include "BLI_math.h" #define spit(x) std::cout << x << std::endl; @@ -94,6 +96,21 @@ void KX_BlenderMaterial::Initialize( ((data->ras_mode &TEX)), game ); + Material *ma = data->material; + + // Save material data to restore on exit + mSavedData.r = ma->r; + mSavedData.g = ma->g; + mSavedData.b = ma->b; + mSavedData.a = ma->alpha; + mSavedData.specr = ma->specr; + mSavedData.specg = ma->specg; + mSavedData.specb = ma->specb; + mSavedData.spec = ma->spec; + mSavedData.ref = ma->ref; + mSavedData.hardness = ma->har; + mSavedData.emit = ma->emit; + mMaterial = data; mShader = 0; mBlenderShader = 0; @@ -124,16 +141,30 @@ void KX_BlenderMaterial::Initialize( KX_BlenderMaterial::~KX_BlenderMaterial() { + Material *ma = mMaterial->material; + // Restore Blender material data + ma->r = mSavedData.r; + ma->g = mSavedData.g; + ma->b = mSavedData.b; + ma->alpha = mSavedData.a; + ma->specr = mSavedData.specr; + ma->specg = mSavedData.specg; + ma->specb = mSavedData.specb; + ma->spec = mSavedData.spec; + ma->ref = mSavedData.ref; + ma->har = mSavedData.hardness; + ma->emit = mSavedData.emit; + // cleanup work if (mConstructed) // clean only if material was actually used OnExit(); } -MTFace* KX_BlenderMaterial::GetMTFace() const +MTexPoly *KX_BlenderMaterial::GetMTexPoly() const { // fonts on polys - return &mMaterial->tface; + return &mMaterial->mtexpoly; } unsigned int* KX_BlenderMaterial::GetMCol() const @@ -160,7 +191,7 @@ Material *KX_BlenderMaterial::GetBlenderMaterial() const Image *KX_BlenderMaterial::GetBlenderImage() const { - return mMaterial->tface.tpage; + return mMaterial->mtexpoly.tpage; } Scene* KX_BlenderMaterial::GetBlenderScene() const @@ -793,17 +824,19 @@ void KX_BlenderMaterial::UpdateIPO( ) { // only works one deep now - mMaterial->speccolor[0] = (float)(specrgb)[0]; - mMaterial->speccolor[1] = (float)(specrgb)[1]; - mMaterial->speccolor[2] = (float)(specrgb)[2]; - mMaterial->matcolor[0] = (float)(rgba[0]); - mMaterial->matcolor[1] = (float)(rgba[1]); - mMaterial->matcolor[2] = (float)(rgba[2]); - mMaterial->alpha = (float)(alpha); - mMaterial->hard = (float)(hard); - mMaterial->emit = (float)(emit); - mMaterial->spec_f = (float)(spec); - mMaterial->ref = (float)(ref); + + // GLSL Multitexture Input + mMaterial->material->specr = mMaterial->speccolor[0] = (float)(specrgb)[0]; + mMaterial->material->specg = mMaterial->speccolor[1] = (float)(specrgb)[1]; + mMaterial->material->specb = mMaterial->speccolor[2] = (float)(specrgb)[2]; + mMaterial->material->r = mMaterial->matcolor[0] = (float)(rgba[0]); + mMaterial->material->g = mMaterial->matcolor[1] = (float)(rgba[1]); + mMaterial->material->b = mMaterial->matcolor[2] = (float)(rgba[2]); + mMaterial->material->alpha = mMaterial->alpha = (float)(rgba[3]); + mMaterial->material->har = mMaterial->hard = (float)(hard); + mMaterial->material->emit = mMaterial->emit = (float)(emit); + mMaterial->material->spec = mMaterial->spec_f = (float)(spec); + mMaterial->material->ref = mMaterial->ref = (float)(ref); } void KX_BlenderMaterial::Replace_IScene(SCA_IScene *val) @@ -813,6 +846,11 @@ void KX_BlenderMaterial::Replace_IScene(SCA_IScene *val) OnConstruction(); } +BL_Material *KX_BlenderMaterial::GetBLMaterial() +{ + return mMaterial; +} + void KX_BlenderMaterial::SetBlenderGLSLShader() { if (!mBlenderShader) @@ -824,6 +862,111 @@ void KX_BlenderMaterial::SetBlenderGLSLShader() } } +#ifdef USE_MATHUTILS + +#define MATHUTILS_COL_CB_MATERIAL_SPECULAR_COLOR 1 +#define MATHUTILS_COL_CB_MATERIAL_DIFFUSE_COLOR 2 + +static unsigned char mathutils_kxblendermaterial_color_cb_index = -1; /* index for our callbacks */ + +static int mathutils_kxblendermaterial_generic_check(BaseMathObject *bmo) +{ + KX_BlenderMaterial *self = static_cast<KX_BlenderMaterial *>BGE_PROXY_REF(bmo->cb_user); + if (!self) + return -1; + + return 0; +} + +static int mathutils_kxblendermaterial_color_get(BaseMathObject *bmo, int subtype) +{ + KX_BlenderMaterial *self = static_cast<KX_BlenderMaterial*>BGE_PROXY_REF(bmo->cb_user); + if (!self) + return -1; + + switch (subtype) { + case MATHUTILS_COL_CB_MATERIAL_DIFFUSE_COLOR: + { + copy_v3_v3(bmo->data, self->GetBLMaterial()->matcolor); + break; + } + case MATHUTILS_COL_CB_MATERIAL_SPECULAR_COLOR: + { + copy_v3_v3(bmo->data, self->GetBLMaterial()->speccolor); + break; + } + } + + return 0; +} + +static int mathutils_kxblendermaterial_color_set(BaseMathObject *bmo, int subtype) +{ + KX_BlenderMaterial *self = static_cast<KX_BlenderMaterial *>BGE_PROXY_REF(bmo->cb_user); + if (!self) + return -1; + + switch (subtype) { + case MATHUTILS_COL_CB_MATERIAL_DIFFUSE_COLOR: + { + BL_Material *mat = self->GetBLMaterial(); + copy_v3_v3(mat->matcolor, bmo->data); + mat->material->r = bmo->data[0]; + mat->material->g = bmo->data[1]; + mat->material->b = bmo->data[2]; + break; + } + case MATHUTILS_COL_CB_MATERIAL_SPECULAR_COLOR: + { + BL_Material *mat = self->GetBLMaterial(); + copy_v3_v3(mat->speccolor, bmo->data); + mat->material->specr = bmo->data[0]; + mat->material->specg = bmo->data[1]; + mat->material->specb = bmo->data[2]; + break; + } + } + + return 0; +} + +static int mathutils_kxblendermaterial_color_get_index(BaseMathObject *bmo, int subtype, int index) +{ + /* lazy, avoid repeteing the case statement */ + if (mathutils_kxblendermaterial_color_get(bmo, subtype) == -1) + return -1; + return 0; +} + +static int mathutils_kxblendermaterial_color_set_index(BaseMathObject *bmo, int subtype, int index) +{ + float f = bmo->data[index]; + + /* lazy, avoid repeateing the case statement */ + if (mathutils_kxblendermaterial_color_get(bmo, subtype) == -1) + return -1; + + bmo->data[index] = f; + return mathutils_kxblendermaterial_color_set(bmo, subtype); +} + +static Mathutils_Callback mathutils_kxblendermaterial_color_cb = { + mathutils_kxblendermaterial_generic_check, + mathutils_kxblendermaterial_color_get, + mathutils_kxblendermaterial_color_set, + mathutils_kxblendermaterial_color_get_index, + mathutils_kxblendermaterial_color_set_index +}; + + +void KX_BlenderMaterial_Mathutils_Callback_Init() +{ + // register mathutils callbacks, ok to run more than once. + mathutils_kxblendermaterial_color_cb_index = Mathutils_RegisterCallback(&mathutils_kxblendermaterial_color_cb); +} + +#endif // USE_MATHUTILS + #ifdef WITH_PYTHON PyMethodDef KX_BlenderMaterial::Methods[] = @@ -838,6 +981,14 @@ PyAttributeDef KX_BlenderMaterial::Attributes[] = { KX_PYATTRIBUTE_RO_FUNCTION("shader", KX_BlenderMaterial, pyattr_get_shader), KX_PYATTRIBUTE_RO_FUNCTION("material_index", KX_BlenderMaterial, pyattr_get_materialIndex), KX_PYATTRIBUTE_RW_FUNCTION("blending", KX_BlenderMaterial, pyattr_get_blending, pyattr_set_blending), + KX_PYATTRIBUTE_RW_FUNCTION("alpha", KX_BlenderMaterial, pyattr_get_alpha, pyattr_set_alpha), + KX_PYATTRIBUTE_RW_FUNCTION("hardness", KX_BlenderMaterial, pyattr_get_hardness, pyattr_set_hardness), + KX_PYATTRIBUTE_RW_FUNCTION("specularIntensity", KX_BlenderMaterial, pyattr_get_specular_intensity, pyattr_set_specular_intensity), + KX_PYATTRIBUTE_RW_FUNCTION("specularColor", KX_BlenderMaterial, pyattr_get_specular_color, pyattr_set_specular_color), + KX_PYATTRIBUTE_RW_FUNCTION("diffuseIntensity", KX_BlenderMaterial, pyattr_get_diffuse_intensity, pyattr_set_diffuse_intensity), + KX_PYATTRIBUTE_RW_FUNCTION("diffuseColor", KX_BlenderMaterial, pyattr_get_diffuse_color, pyattr_set_diffuse_color), + KX_PYATTRIBUTE_RW_FUNCTION("emit", KX_BlenderMaterial, pyattr_get_emit, pyattr_set_emit), + { NULL } //Sentinel }; @@ -882,6 +1033,170 @@ PyObject *KX_BlenderMaterial::pyattr_get_blending(void *self_v, const KX_PYATTRI return Py_BuildValue("(ll)", (long int)bfunc[0], (long int)bfunc[1]); } +PyObject *KX_BlenderMaterial::pyattr_get_alpha(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_BlenderMaterial *self = static_cast<KX_BlenderMaterial *>(self_v); + return PyFloat_FromDouble(self->GetBLMaterial()->alpha); +} + +int KX_BlenderMaterial::pyattr_set_alpha(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + KX_BlenderMaterial *self = static_cast<KX_BlenderMaterial *>(self_v); + float val = PyFloat_AsDouble(value); + + if (val == -1 && PyErr_Occurred()) { + PyErr_Format(PyExc_AttributeError, "material.%s = float: KX_BlenderMaterial, expected a float", attrdef->m_name); + return PY_SET_ATTR_FAIL; + } + + CLAMP(val, 0.0f, 1.0f); + + BL_Material *mat = self->GetBLMaterial(); + mat->alpha = mat->material->alpha = val; + return PY_SET_ATTR_SUCCESS; +} +PyObject *KX_BlenderMaterial::pyattr_get_hardness(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_BlenderMaterial *self = static_cast<KX_BlenderMaterial *>(self_v); + return PyLong_FromLong(self->GetBLMaterial()->hard); +} + +int KX_BlenderMaterial::pyattr_set_hardness(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + KX_BlenderMaterial *self = static_cast<KX_BlenderMaterial *>(self_v); + int val = PyLong_AsLong(value); + + if (val == -1 && PyErr_Occurred()) { + PyErr_Format(PyExc_AttributeError, "material.%s = int: KX_BlenderMaterial, expected a int", attrdef->m_name); + return PY_SET_ATTR_FAIL; + } + + CLAMP(val, 1, 511); + + BL_Material *mat = self->GetBLMaterial(); + mat->hard = mat->material->har = val; + return PY_SET_ATTR_SUCCESS; +} + +PyObject *KX_BlenderMaterial::pyattr_get_specular_intensity(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_BlenderMaterial *self = static_cast<KX_BlenderMaterial *>(self_v); + return PyFloat_FromDouble(self->GetBLMaterial()->spec_f); +} + +int KX_BlenderMaterial::pyattr_set_specular_intensity(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + KX_BlenderMaterial *self = static_cast<KX_BlenderMaterial *>(self_v); + float val = PyFloat_AsDouble(value); + + if (val == -1 && PyErr_Occurred()) { + PyErr_Format(PyExc_AttributeError, "material.%s = float: KX_BlenderMaterial, expected a float", attrdef->m_name); + return PY_SET_ATTR_FAIL; + } + + CLAMP(val, 0.0f, 1.0f); + + BL_Material *mat = self->GetBLMaterial(); + mat->spec_f = mat->material->spec = val; + return PY_SET_ATTR_SUCCESS; +} + +PyObject *KX_BlenderMaterial::pyattr_get_specular_color(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ +#ifdef USE_MATHUTILS + return Color_CreatePyObject_cb(BGE_PROXY_FROM_REF(self_v), mathutils_kxblendermaterial_color_cb_index, MATHUTILS_COL_CB_MATERIAL_SPECULAR_COLOR); +#else + KX_BlenderMaterial *self = static_cast<KX_BlenderMaterial *>(self_v); + return PyColorFromVector(MT_Vector3(self->GetBLMaterial()->speccolor)); +#endif +} + +int KX_BlenderMaterial::pyattr_set_specular_color(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + KX_BlenderMaterial *self = static_cast<KX_BlenderMaterial *>(self_v); + MT_Vector3 color; + if (!PyVecTo(value, color)) + return PY_SET_ATTR_FAIL; + + BL_Material *mat = self->GetBLMaterial(); + color.getValue(mat->speccolor); + mat->material->specr = color[0]; + mat->material->specg = color[1]; + mat->material->specb = color[2]; + return PY_SET_ATTR_SUCCESS; +} + +PyObject *KX_BlenderMaterial::pyattr_get_diffuse_intensity(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_BlenderMaterial *self = static_cast<KX_BlenderMaterial *>(self_v); + return PyFloat_FromDouble(self->GetBLMaterial()->ref); +} + +int KX_BlenderMaterial::pyattr_set_diffuse_intensity(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + KX_BlenderMaterial *self = static_cast<KX_BlenderMaterial *>(self_v); + float val = PyFloat_AsDouble(value); + + if (val == -1 && PyErr_Occurred()) { + PyErr_Format(PyExc_AttributeError, "material.%s = float: KX_BlenderMaterial, expected a float", attrdef->m_name); + return PY_SET_ATTR_FAIL; + } + + CLAMP(val, 0.0f, 1.0f); + + BL_Material *mat = self->GetBLMaterial(); + mat->ref = mat->material->ref = val; + return PY_SET_ATTR_SUCCESS; +} + +PyObject *KX_BlenderMaterial::pyattr_get_diffuse_color(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ +#ifdef USE_MATHUTILS + return Color_CreatePyObject_cb(BGE_PROXY_FROM_REF(self_v), mathutils_kxblendermaterial_color_cb_index, MATHUTILS_COL_CB_MATERIAL_DIFFUSE_COLOR); +#else + KX_BlenderMaterial *self = static_cast<KX_BlenderMaterial *>(self_v); + return PyColorFromVector(MT_Vector3(self->GetBLMaterial()->matcolor)); +#endif +} + +int KX_BlenderMaterial::pyattr_set_diffuse_color(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + KX_BlenderMaterial *self = static_cast<KX_BlenderMaterial *>(self_v); + MT_Vector3 color; + if (!PyVecTo(value, color)) + return PY_SET_ATTR_FAIL; + + BL_Material *mat = self->GetBLMaterial(); + color.getValue(mat->matcolor); + mat->material->r = color[0]; + mat->material->g = color[1]; + mat->material->b = color[2]; + return PY_SET_ATTR_SUCCESS; +} + +PyObject *KX_BlenderMaterial::pyattr_get_emit(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_BlenderMaterial *self = static_cast<KX_BlenderMaterial *>(self_v); + return PyFloat_FromDouble(self->GetBLMaterial()->emit); +} + +int KX_BlenderMaterial::pyattr_set_emit(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + KX_BlenderMaterial *self = static_cast<KX_BlenderMaterial *>(self_v); + float val = PyFloat_AsDouble(value); + + if (val == -1 && PyErr_Occurred()) { + PyErr_Format(PyExc_AttributeError, "material.%s = float: KX_BlenderMaterial, expected a float", attrdef->m_name); + return PY_SET_ATTR_FAIL; + } + + CLAMP(val, 0.0f, 2.0f); + + BL_Material *mat = self->GetBLMaterial(); + mat->emit = mat->material->emit = val; + return PY_SET_ATTR_SUCCESS; +} + int KX_BlenderMaterial::pyattr_set_blending(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) { KX_BlenderMaterial* self = static_cast<KX_BlenderMaterial*>(self_v); |