BGE: Fix T44700 mesh without material in blenderplayer.

If a mesh doesn't have a material we don't initialize the mSavedData in KX_BlenderMaterial to avoid crash.
This commit is contained in:
Porteries Tristan 2015-05-15 14:50:46 +02:00
parent 7c06190882
commit 2fa4a48bce
Notes: blender-bot 2023-02-14 11:18:07 +01:00
Referenced by commit 2da9a39418, BGE : Fix black material on meshes without materials in blenderplayer.
Referenced by issue #44700, Blenderplayer segfaults after "BGE: Adding material IPO support to GLSL materials"
1 changed files with 57 additions and 36 deletions

View File

@ -96,18 +96,20 @@ void KX_BlenderMaterial::Initialize(
);
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;
if (ma) {
// 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;
@ -140,18 +142,21 @@ 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;
if (ma) {
// 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)
@ -823,18 +828,34 @@ void KX_BlenderMaterial::UpdateIPO(
{
// only works one deep now
// 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);
// Multitexture Input
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)(rgba[3]);
mMaterial->hard = (float)(hard);
mMaterial->emit = (float)(emit);
mMaterial->spec_f = (float)(spec);
mMaterial->ref = (float)(ref);
Material *ma = mMaterial->material;
if (ma) {
// GLSL Input
ma->specr = (float)(specrgb)[0];
ma->specg = (float)(specrgb)[1];
ma->specb = (float)(specrgb)[2];
ma->r = (float)(rgba[0]);
ma->g = (float)(rgba[1]);
ma->b = (float)(rgba[2]);
ma->alpha = (float)(rgba[3]);
ma->har = (float)(hard);
ma->emit = (float)(emit);
ma->spec = (float)(spec);
ma->ref = (float)(ref);
}
}
void KX_BlenderMaterial::Replace_IScene(SCA_IScene *val)