SG_Controller* KX_WorldIpoController::GetReplica(class SG_Node* destnode) { KX_WorldIpoController* iporeplica = new KX_WorldIpoController(*this); // clear object that ipo acts on iporeplica->ClearObject(); // dirty hack, ask Gino for a better solution in the ipo implementation // hacken en zagen, in what we call datahiding, not written for replication :( T_InterpolatorList oldlist = m_interpolators; iporeplica->m_interpolators.clear(); T_InterpolatorList::iterator i; for (i = oldlist.begin(); !(i == oldlist.end()); ++i) { KX_ScalarInterpolator* copyipo = new KX_ScalarInterpolator(*((KX_ScalarInterpolator*)*i)); iporeplica->AddInterpolator(copyipo); MT_Scalar* scaal = ((KX_ScalarInterpolator*)*i)->GetTarget(); uint_ptr orgbase = (uint_ptr)this; uint_ptr orgloc = (uint_ptr)scaal; uint_ptr offset = orgloc-orgbase; uint_ptr newaddrbase = (uint_ptr)iporeplica + offset; MT_Scalar* blaptr = (MT_Scalar*) newaddrbase; copyipo->SetNewTarget((MT_Scalar*)blaptr); } return iporeplica; }
void BL_ConvertWorldIpos(struct World* blenderworld,KX_BlenderSceneConverter *converter) { if (blenderworld->adt) { 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, converter); // 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); ipocontr->AddInterpolator(interpolator); ipocontr->SetModifyMistColor(true); } } if ((interp = adtList->GetScalarInterpolator("mist.depth", 0))) { 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); ipocontr->AddInterpolator(interpolator); ipocontr->SetModifyMistStart(true); } } }