@@ -764,7 +764,20 @@ public override ExpressionDrawer.IDrawable DrawableFromMemory(MemoryReader.Conve
764764 }
765765
766766 abstract class NSphereLoader : GeometryLoader < ExpressionDrawer . NSphere >
767- { }
767+ {
768+ public override ExpressionDrawer . IDrawable DrawableFromMemory ( MemoryReader . Converter < double > converter ,
769+ double [ ] values , int offset )
770+ {
771+ int valCount = converter . ValueCount ( ) ;
772+ if ( valCount == 3 )
773+ {
774+ var c = new ExpressionDrawer . Point ( values [ offset ] , values [ offset + 1 ] ) ;
775+ var r = values [ offset + 2 ] ;
776+ return new ExpressionDrawer . NSphere ( c , r ) ;
777+ }
778+ return null ;
779+ }
780+ }
768781
769782 abstract class RangeLoader < ResultType > : GeometryLoader < ResultType >
770783 where ResultType : ExpressionDrawer . IDrawable
@@ -1158,22 +1171,35 @@ public Loader Create(Loaders loaders, Debugger debugger, string name, string typ
11581171 return null ;
11591172
11601173 string m_center = name + ".m_center" ;
1174+ string m_radius = name + ".m_radius" ;
11611175
11621176 string pointType = tparams [ 0 ] ;
11631177 PointLoader pointLoader = loaders . FindByType ( ExpressionLoader . Kind . Point ,
11641178 m_center ,
11651179 pointType ) as PointLoader ;
1166- if ( pointLoader == null )
1167- return null ;
11681180
1169- return new BGNSphere ( pointLoader , pointType ) ;
1181+ string radiusType = tparams [ 1 ] ;
1182+
1183+ return pointLoader != null
1184+ && debugger . GetTypeSizeof ( type , out int sizeOf )
1185+ && debugger . GetAddressOffset ( name , m_center , out long centerDiff )
1186+ && debugger . GetAddressOffset ( name , m_radius , out long radiusDiff )
1187+ && debugger . GetCppSizeof ( radiusType , out int radiusSize )
1188+ && ! Debugger . IsInvalidOffset ( sizeOf , centerDiff , radiusDiff )
1189+ ? new BGNSphere ( pointLoader , pointType , radiusType , radiusSize , sizeOf , centerDiff , radiusDiff )
1190+ : null ;
11701191 }
11711192 }
11721193
1173- private BGNSphere ( PointLoader pointLoader , string pointType )
1194+ private BGNSphere ( PointLoader pointLoader , string pointType , string radiusType , int radiusSize , int sizeOf , long centerDiff , long radiusDiff )
11741195 {
11751196 this . pointLoader = pointLoader ;
11761197 this . pointType = pointType ;
1198+ this . radiusType = radiusType ;
1199+ this . radiusSize = radiusSize ;
1200+ this . sizeOf = sizeOf ;
1201+ this . centerDiff = centerDiff ;
1202+ this . radiusDiff = radiusDiff ;
11771203 }
11781204
11791205 public override Geometry . Traits GetTraits ( MemoryReader mreader , Debugger debugger ,
@@ -1189,18 +1215,42 @@ public override ExpressionDrawer.IDrawable Load(MemoryReader mreader, Debugger d
11891215 string m_center = name + ".m_center" ;
11901216 string m_radius = name + ".m_radius" ;
11911217
1192- Geometry . Point center = pointLoader . LoadPoint ( mreader , debugger ,
1193- m_center , pointType ) ;
1194-
1218+ Geometry . Point center = pointLoader . LoadPoint ( mreader , debugger , m_center , pointType ) ;
11951219 bool ok = debugger . TryLoadDouble ( m_radius , out double radius ) ;
11961220
11971221 return Util . IsOk ( center , ok )
11981222 ? new ExpressionDrawer . NSphere ( center , radius )
11991223 : null ;
12001224 }
12011225
1226+ public override MemoryReader . Converter < double > GetMemoryConverter ( MemoryReader mreader ,
1227+ Debugger debugger , // TODO - remove
1228+ string name , string type )
1229+ {
1230+ // NOTE: In case it was created by derived class and these members set to invalid values
1231+ if ( sizeOf <= 0
1232+ || Debugger . IsInvalidOffset ( sizeOf , centerDiff , radiusDiff ) )
1233+ return null ;
1234+
1235+ string m_center = name + ".m_center" ;
1236+ MemoryReader . Converter < double > pointConverter = pointLoader . GetMemoryConverter ( mreader , debugger , m_center , pointType ) ;
1237+ if ( pointConverter == null )
1238+ return null ;
1239+
1240+ MemoryReader . Converter < double > radiusConverter = mreader . GetNumericConverter ( radiusType , radiusSize ) ;
1241+
1242+ return new MemoryReader . StructConverter < double > ( sizeOf ,
1243+ new MemoryReader . Member < double > ( pointConverter , ( int ) centerDiff ) ,
1244+ new MemoryReader . Member < double > ( radiusConverter , ( int ) radiusDiff ) ) ;
1245+ }
1246+
12021247 private readonly PointLoader pointLoader ;
12031248 private readonly string pointType ;
1249+ private readonly string radiusType ;
1250+ private readonly int radiusSize ;
1251+ private readonly long centerDiff ;
1252+ private readonly long radiusDiff ;
1253+ private readonly int sizeOf ;
12041254 }
12051255
12061256 abstract class PointRange < ResultType > : RangeLoader < ResultType >
0 commit comments