BGE: Fix T27322: World F-Curve

This patch fixes the world (mist, background, ambient) F-Curve for  for the BGE.

Reviewers: moguri, brecht

Reviewed By: moguri, brecht

Differential Revision: https://developer.blender.org/D150
This commit is contained in:
Thomas Szepe 2015-03-23 21:43:42 +01:00
parent d07c666a0e
commit e7ae96ad41
5 changed files with 108 additions and 47 deletions

@ -49,6 +49,7 @@ extern "C" {
// Needed for material IPOs
#include "BKE_material.h"
#include "DNA_material_types.h"
#include "DNA_scene_types.h"
}
#include "MEM_guardedalloc.h"
@ -162,6 +163,14 @@ bool BL_Action::Play(const char* name,
m_obj->GetSGNode()->AddSGController(sg_contr);
sg_contr->SetObject(m_obj->GetSGNode());
// World
sg_contr = BL_CreateWorldIPO(m_action, kxscene->GetBlenderScene()->world, kxscene->GetSceneConverter());
if (sg_contr) {
m_sg_contr_list.push_back(sg_contr);
m_obj->GetSGNode()->AddSGController(sg_contr);
sg_contr->SetObject(m_obj->GetSGNode());
}
// Try obcolor
sg_contr = BL_CreateObColorIPO(m_action, m_obj, kxscene->GetSceneConverter());
if (sg_contr) {

@ -269,52 +269,80 @@ SG_Controller *BL_CreateCameraIPO(struct bAction *action, KX_GameObject* camera
return ipocontr;
}
void BL_ConvertWorldIpos(struct World* blenderworld,KX_BlenderSceneConverter *converter)
SG_Controller * BL_CreateWorldIPO( bAction *action, struct World *blenderworld, KX_BlenderSceneConverter *converter )
{
KX_WorldIpoController *ipocontr = NULL;
if (blenderworld->adt) {
if (blenderworld) {
BL_InterpolatorList *adtList = GetAdtList(action, converter);
KX_WorldIpoController* ipocontr = new KX_WorldIpoController();
// Erwin, hook up the world ipo controller here
// Gino: hook it up to what ?
// is there a userinterface element for that ?
// for now, we have some new python hooks to access the data, for a work-around
ipocontr->m_mist_start = blenderworld->miststa;
ipocontr->m_mist_dist = blenderworld->mistdist;
ipocontr->m_mist_rgb[0] = blenderworld->horr;
ipocontr->m_mist_rgb[1] = blenderworld->horg;
ipocontr->m_mist_rgb[2] = blenderworld->horb;
BL_InterpolatorList *adtList= GetAdtList(blenderworld->adt->action, converter);
// For each active channel in the adtList add an
// interpolator to the game object.
// For each active channel in the adtList add an interpolator to the game object.
KX_IInterpolator *interpolator;
KX_IScalarInterpolator *interp;
for (int i=0; i<3; i++) {
if ((interp = adtList->GetScalarInterpolator("horizon_color", i))) {
interpolator= new KX_ScalarInterpolator(&ipocontr->m_mist_rgb[i], interp);
if ((interp = adtList->GetScalarInterpolator("ambient_color", i))) {
if (!ipocontr) {
ipocontr = new KX_WorldIpoController();
}
interpolator = new KX_ScalarInterpolator(&ipocontr->m_ambi_rgb[i], interp);
ipocontr->AddInterpolator(interpolator);
ipocontr->SetModifyMistColor(true);
ipocontr->SetModifyAmbientColor(true);
}
}
if ((interp = adtList->GetScalarInterpolator("mist.depth", 0))) {
interpolator= new KX_ScalarInterpolator(&ipocontr->m_mist_dist, interp);
for (int i=0; i<3; i++) {
if ((interp = adtList->GetScalarInterpolator("horizon_color", i))) {
if (!ipocontr) {
ipocontr = new KX_WorldIpoController();
}
interpolator = new KX_ScalarInterpolator(&ipocontr->m_hori_rgb[i], interp);
ipocontr->AddInterpolator(interpolator);
ipocontr->SetModifyHorizonColor(true);
}
}
if ((interp = adtList->GetScalarInterpolator("mist_settings.start", 0))) {
if (!ipocontr) {
ipocontr = new KX_WorldIpoController();
}
interpolator = new KX_ScalarInterpolator(&ipocontr->m_mist_start, interp);
ipocontr->AddInterpolator(interpolator);
ipocontr->SetModifyMistStart(true);
}
if ((interp = adtList->GetScalarInterpolator("mist_settings.depth", 0))) {
if (!ipocontr) {
ipocontr = new KX_WorldIpoController();
}
interpolator = new KX_ScalarInterpolator(&ipocontr->m_mist_dist, interp);
ipocontr->AddInterpolator(interpolator);
ipocontr->SetModifyMistDist(true);
}
if ((interp = adtList->GetScalarInterpolator("mist.start", 0))) {
interpolator= new KX_ScalarInterpolator(&ipocontr->m_mist_start, interp);
if ((interp = adtList->GetScalarInterpolator("mist_settings.intensity", 0))) {
if (!ipocontr) {
ipocontr = new KX_WorldIpoController();
}
interpolator = new KX_ScalarInterpolator(&ipocontr->m_mist_intensity, interp);
ipocontr->AddInterpolator(interpolator);
ipocontr->SetModifyMistStart(true);
ipocontr->SetModifyMistIntensity(true);
}
if (ipocontr) {
ipocontr->m_mist_start = blenderworld->miststa;
ipocontr->m_mist_dist = blenderworld->mistdist;
ipocontr->m_mist_intensity = blenderworld->misi;
ipocontr->m_hori_rgb[0] = blenderworld->horr;
ipocontr->m_hori_rgb[1] = blenderworld->horg;
ipocontr->m_hori_rgb[2] = blenderworld->horb;
ipocontr->m_ambi_rgb[0] = blenderworld->ambr;
ipocontr->m_ambi_rgb[1] = blenderworld->ambg;
ipocontr->m_ambi_rgb[2] = blenderworld->ambb;
}
}
return ipocontr;
}
SG_Controller *BL_CreateMaterialIpo(

@ -50,7 +50,8 @@ SG_Controller *BL_CreateLampIPO(bAction *action,
KX_GameObject* lightobj,
KX_BlenderSceneConverter *converter);
void BL_ConvertWorldIpos(struct World* blenderworld,
SG_Controller *BL_CreateWorldIPO(bAction *action,
struct World *blenderworld,
KX_BlenderSceneConverter *converter);
SG_Controller *BL_CreateCameraIPO(bAction *action,

@ -33,6 +33,8 @@
#include "KX_WorldIpoController.h"
#include "KX_ScalarInterpolator.h"
#include "KX_WorldInfo.h"
#include "KX_PythonInit.h"
#include "KX_Scene.h"
#if defined(_WIN64)
typedef unsigned __int64 uint_ptr;
@ -42,29 +44,36 @@ typedef unsigned long uint_ptr;
bool KX_WorldIpoController::Update(double currentTime)
{
if (m_modified)
{
if (m_modified) {
T_InterpolatorList::iterator i;
for (i = m_interpolators.begin(); !(i == m_interpolators.end()); ++i) {
(*i)->Execute(m_ipotime);//currentTime);
(*i)->Execute(m_ipotime);
}
/* TODO, this will crash! */
KX_WorldInfo *world = NULL;
KX_WorldInfo *world = KX_GetActiveScene()->GetWorldInfo();
if (m_modify_mist_start) {
world->setMistStart(m_mist_start);
}
if (m_modify_mist_color) {
world->setMistColor(m_mist_rgb[0], m_mist_rgb[1], m_mist_rgb[2]);
}
if (m_modify_mist_dist) {
world->setMistDistance(m_mist_dist);
}
m_modified=false;
if (m_modify_mist_intensity) {
world->setMistIntensity(m_mist_intensity);
}
if (m_modify_horizon_color) {
world->setBackColor(m_hori_rgb[0], m_hori_rgb[1], m_hori_rgb[2]);
world->setMistColor(m_hori_rgb[0], m_hori_rgb[1], m_hori_rgb[2]);
}
if (m_modify_ambient_color) {
world->setAmbientColor(m_ambi_rgb[0], m_ambi_rgb[1], m_ambi_rgb[2]);
}
m_modified = false;
}
return false;
}

@ -39,24 +39,30 @@
class KX_WorldIpoController : public SG_Controller
{
public:
MT_Scalar m_mist_rgb[3];
MT_Scalar m_mist_start;
MT_Scalar m_mist_dist;
MT_Scalar m_mist_intensity;
MT_Scalar m_hori_rgb[3];
MT_Scalar m_ambi_rgb[3];
private:
T_InterpolatorList m_interpolators;
unsigned short m_modify_mist_color : 1;
unsigned short m_modify_mist_start : 1;
unsigned short m_modify_mist_dist : 1;
unsigned short m_modify_mist_intensity : 1;
unsigned short m_modify_horizon_color : 1;
unsigned short m_modify_ambient_color : 1;
bool m_modified;
double m_ipotime;
public:
KX_WorldIpoController() :
m_modify_mist_color(false),
m_modify_mist_start(false),
m_modify_mist_dist(false),
m_modify_mist_intensity(false),
m_modify_horizon_color(false),
m_modify_ambient_color(false),
m_modified(true),
m_ipotime(0.0)
{}
@ -76,14 +82,22 @@ public:
m_modify_mist_start = modify;
}
void SetModifyMistColor(bool modify) {
m_modify_mist_color = modify;
}
void SetModifyMistDist(bool modify) {
m_modify_mist_dist = modify;
}
void SetModifyMistIntensity(bool modify) {
m_modify_mist_intensity = modify;
}
void SetModifyHorizonColor(bool modify) {
m_modify_horizon_color = modify;
}
void SetModifyAmbientColor(bool modify) {
m_modify_ambient_color = modify;
}
void
SetOption(
int option,