bool TSStatic::onAdd() { PROFILE_SCOPE(TSStatic_onAdd); if ( isServerObject() ) { // Handle the old "usePolysoup" field SimFieldDictionary* fieldDict = getFieldDictionary(); if ( fieldDict ) { StringTableEntry slotName = StringTable->insert( "usePolysoup" ); SimFieldDictionary::Entry * entry = fieldDict->findDynamicField( slotName ); if ( entry ) { // Was "usePolysoup" set? bool usePolysoup = dAtob( entry->value ); // "usePolysoup" maps to the new VisibleMesh type if ( usePolysoup ) mCollisionType = VisibleMesh; // Remove the field in favor on the new "collisionType" field fieldDict->setFieldValue( slotName, "" ); } } } if ( !Parent::onAdd() ) return false; // Setup the shape. if ( !_createShape() ) { Con::errorf( "TSStatic::onAdd() - Shape creation failed!" ); return false; } setRenderTransform(mObjToWorld); // Register for the resource change signal. ResourceManager::get().getChangedSignal().notify( this, &TSStatic::_onResourceChanged ); addToScene(); _updateShouldTick(); // Accumulation if ( isClientObject() && mShapeInstance ) { if ( mShapeInstance->hasAccumulation() ) AccumulationVolume::addObject(this); } return true; }
// BTRTODO: Support arrays!? MaterialParameters* ProcessedCustomMaterial::allocMaterialParameters() { MaterialParameters* ret = Parent::allocMaterialParameters(); // See if any of the dynamic fields match up with shader constants we have. SimFieldDictionary* fields = mMaterial->getFieldDictionary(); if (!fields || fields->getNumFields() == 0) return ret; const Vector<GFXShaderConstDesc>& consts = ret->getShaderConstDesc(); for (U32 i = 0; i < consts.size(); i++) { // strip the dollar sign from the front. String stripped(consts[i].name); stripped.erase(0, 1); SimFieldDictionary::Entry* field = fields->findDynamicField(stripped); if (field) { MaterialParameterHandle* handle = getMaterialParameterHandle(consts[i].name); switch (consts[i].constType) { case GFXSCT_Float : setMaterialParameter<F32>(ret, handle, field->value); break; case GFXSCT_Float2: setMaterialParameter<Point2F>(ret, handle, field->value); break; case GFXSCT_Float3: setMaterialParameter<Point3F>(ret, handle, field->value); break; case GFXSCT_Float4: setMaterialParameter<Point4F>(ret, handle, field->value); break; case GFXSCT_Float2x2: case GFXSCT_Float3x3: setMatrixParameter(ret, handle, field->value, consts[i].constType); break; case GFXSCT_Float4x4: setMaterialParameter<MatrixF>(ret, handle, field->value); break; case GFXSCT_Int: setMaterialParameter<S32>(ret, handle, field->value); break; case GFXSCT_Int2: setMaterialParameter<Point2I>(ret, handle, field->value); break; case GFXSCT_Int3: setMaterialParameter<Point3I>(ret, handle, field->value); break; case GFXSCT_Int4: setMaterialParameter<Point4I>(ret, handle, field->value); break; // Do we want to ignore these? case GFXSCT_Sampler: case GFXSCT_SamplerCube: default: break; } } } return ret; }