public void CopyMatchingNamedConstantsFrom( GpuProgramParameters source ) { if ( this._namedConstants == null || source == null ) { return; } var srcToDestNamedMap = new Dictionary<int, string>(); foreach ( var i in source._namedConstants.Map ) { var paramName = i.Key; var olddef = i.Value; var newdef = FindNamedConstantDefinition( paramName, false ); if ( newdef == null ) { continue; } // Copy data across, based on smallest common definition size var srcsz = olddef.ElementSize*olddef.ArraySize; var destsz = newdef.ElementSize*newdef.ArraySize; var sz = Utility.Min( srcsz, destsz ); if ( newdef.IsFloat ) { Memory.Copy( source.GetFloatPointer( olddef.PhysicalIndex ).Pointer, GetFloatPointer( newdef.PhysicalIndex ).Pointer, sz*sizeof ( float ) ); } else { Memory.Copy( source.GetIntPointer( olddef.PhysicalIndex ).Pointer, GetIntPointer( newdef.PhysicalIndex ).Pointer, sz*sizeof ( int ) ); } // we'll use this map to resolve autos later // ignore the [0] aliases if ( !paramName.EndsWith( "[0]" ) ) { srcToDestNamedMap.Add( olddef.PhysicalIndex, paramName ); } } foreach ( var i in source.autoConstants ) { var autoEntry = i; // find dest physical index if ( srcToDestNamedMap.ContainsKey( autoEntry.PhysicalIndex ) ) { var miSecond = srcToDestNamedMap[ autoEntry.PhysicalIndex ]; if ( autoEntry.FData != 0 ) { SetNamedAutoConstantReal( miSecond, autoEntry.Type, autoEntry.FData ); } else { SetNamedAutoConstant( miSecond, autoEntry.Type, autoEntry.Data ); } } } // Copy shared param sets foreach ( var usage in source._sharedParamSets ) { if ( !IsUsingSharedParameters( usage.Name ) ) { AddSharedParameters( usage.SharedParameters ); } } }