home *** CD-ROM | disk | FTP | other *** search
/ Stone Design / Stone Design.iso / Stone_Friends / Wave / WavesWorld / Source / IBPalettes / WW3DKit / WW3DHeightField.m < prev    next >
Encoding:
Text File  |  1995-03-22  |  6.5 KB  |  279 lines

  1.  
  2. #import "WW3DHeightField.h"
  3.  
  4. #import "RIBTransformBegin.h"
  5. #import "RIBScale.h"
  6. #import "RIBSphere.h"
  7. #import "RIBTransformEnd.h"
  8. #import "WWSample.h"
  9. #import "WWEveParser.h"
  10. #import "WW3DAttributeState.h"
  11.  
  12. @implementation WW3DHeightField
  13.  
  14. + initialize { return [WW3DHeightField setVersion:1], self; }
  15.  
  16. - init
  17. {
  18.   [super init];
  19.  
  20.   zScale = 1.0/255.;
  21.   ribCommandList  = [[RIBCommandList alloc] init];
  22.   dirtyBoundingBox = YES;
  23.   
  24.   return self;
  25. }
  26.  
  27.  
  28. - awake
  29. {
  30.     [super awake];
  31.     dirtyBoundingBox = YES;
  32.     return self;
  33. }
  34.  
  35.  
  36. - (BOOL)pushesOrPopsCTM { return NO; }
  37. - (BOOL)pushesCTM { return NO; }
  38. - (BOOL)popsCTM { return NO; }
  39.  
  40. - setZScale:(RtFloat)newZScale
  41. {
  42.    zScale = newZScale;
  43.    return self;
  44. }
  45.  
  46. - setImageName:(const char *)newImageName
  47.      zScale:(float)newZScale
  48.      n:(int)newN tokens:(RtToken *)newTokens parms:(RtPointer *)newParms archiveVector:(char **)newArchiveVector
  49.      printfTypeVector:(int *)newPrintfTypeVector printfNVector:(int *)newPrintfNVector
  50. {  
  51.    id  sphereObj;
  52.  
  53.  
  54.    image = nil;
  55.    if (filename && *filename)
  56.    { image = [NXImage findImageNamed:filename];
  57.      if (!image) 
  58.      {  image = [[NXImage alloc] init];
  59.         [image setDataRetained:YES];
  60.         if (![image loadFromFile:filename])
  61.         {  NXLogError("unable to load image from file <%s>\n", filename);
  62.            return nil; 
  63.      }
  64.      }
  65.    }
  66.  
  67.  
  68.    [ribCommandList empty];
  69.  
  70.    sphereObj = [[RIBSphere alloc] init]; 
  71.    [sphereObj setRadius:radius zMin:zMin zMax:zMax thetaMax:thetaMax
  72.                     n:newN tokens:newTokens parms:newParms archiveVector:newArchiveVector printfTypeVector:newPrintfTypeVector printfNVector:newPrintfNVector];
  73.    [sphereObj setMyShape:myShape];
  74.  
  75.    [ribCommandList insertObject:sphereObj at:0];
  76.    [ribCommandList insertObject:[[[[RIBScale alloc] init] setSX:xScale sy:yScale sz:zScale] setMyShape:myShape] at:0];
  77.    [ribCommandList insertObject:[[[RIBTransformBegin alloc] init] setMyShape:myShape] at:0];
  78.    [ribCommandList addObject:[[[RIBTransformEnd alloc] init] setMyShape:myShape]];
  79.  
  80.    dirtyBoundingBox = TRUE;
  81.   
  82.    return self;
  83. }
  84.  
  85. - setRadius:(RtFloat)newRadius { radius = newRadius; dirtyBoundingBox = TRUE; return self; }
  86. - setZMin:(RtFloat)newZMin { zMin = newZMin; dirtyBoundingBox = TRUE; return self; }
  87. - setZMax:(RtFloat)newZMax { zMax = newZMax; dirtyBoundingBox = TRUE; return self; }
  88.  
  89. - (RtFloat)radius { return radius; } 
  90. - (RtFloat)zMin { return zMin; }
  91. - (RtFloat)zMax { return zMax; }
  92.  
  93. - free
  94. {
  95.     [ribCommandList free];
  96.     return [super free];
  97. }
  98.  
  99. - (BOOL)hasBoundingBox        { return YES; }
  100. - (BOOL)isMotionBlurrable    { return YES; }
  101. - (BOOL)isCompoundCommand    { return YES; }
  102.  
  103. - setBoundingBox:(RtBound *)newBoundingBox
  104. {
  105.     N3D_CopyBound(*newBoundingBox, boundingBox);
  106.     return self;
  107. }
  108.  
  109. - calculateBoundingBoxStartingAt:(RtFloat)shutterOpenTime endingAt:(RtFloat)shutterCloseTime  
  110. {  
  111.     dirtyBoundingBox = NO;
  112.     return [self setBoundingBox:[ribCommandList boundingBoxStartingAt:shutterOpenTime endingAt:shutterCloseTime]];
  113. }
  114.  
  115. - (RtBound *)boundingBoxStartingAt:(RtFloat)intervalStartTime endingAt:(RtFloat)intervalEndTime
  116.    if (dirtyBoundingBox) 
  117.    {  [self calculateBoundingBoxStartingAt:intervalStartTime endingAt:intervalEndTime];
  118.    }
  119.    return &boundingBox; 
  120. }
  121.  
  122.  
  123. - (float)lastSampleIsAt { return 0.0; }
  124.  
  125. - (unsigned long int)maxSampleBandwidth { return [ribCommandList maxSampleBandwidth]; }
  126.  
  127. - setMyShape:shape
  128. {
  129.     myShape = shape;
  130.     return self;
  131. }
  132.  
  133. - shape
  134. {
  135.     return myShape;
  136. }
  137.  
  138. - renderMaps:(WW3DCamera *)camera
  139.     startingAt:(RtFloat)shutterOpenTime
  140.     endingAt:(RtFloat)shutterCloseTime usingStream:(NXStream *)ns
  141. {
  142.     return self;
  143. }
  144.  
  145. - renderMaps:(WW3DCamera *)camera usingStream:(NXStream *)ns
  146. {
  147.     return self;
  148. }
  149.  
  150. - renderMaps:(WW3DCamera *)camera
  151.     startingAt:(RtFloat)shutterOpenTime
  152.     endingAt:(RtFloat)shutterCloseTime
  153. {
  154.     return self;
  155. }
  156.  
  157. - renderMaps:(WW3DCamera *)camera
  158. {
  159.     return self;
  160. }
  161.  
  162. - renderSelfAsBox:(WW3DCamera *)camera
  163.     startingAt:(RtFloat)shutterOpenTime
  164.     endingAt:(RtFloat)shutterCloseTime
  165. {
  166.     return [ribCommandList renderSelfAsBox:camera
  167.                startingAt:shutterOpenTime
  168.                endingAt:shutterCloseTime];
  169. }
  170.  
  171. - renderSelf:(WW3DCamera *)camera
  172.     startingAt:(RtFloat)shutterOpenTime
  173.     endingAt:(RtFloat)shutterCloseTime
  174. {
  175.     return [ribCommandList renderSelf:camera
  176.                startingAt:shutterOpenTime
  177.                endingAt:shutterCloseTime];
  178. }
  179.  
  180. - renderSelf:(WW3DCamera *)camera
  181. {
  182.     return [ribCommandList renderSelf:camera];
  183. }
  184.  
  185. - preRenderSelf:(WW3DCamera *)camera
  186.     startingAt:(RtFloat)shutterOpenTime
  187.     endingAt:(RtFloat)shutterCloseTime
  188. {
  189.     return [ribCommandList preRenderSelf:camera
  190.                startingAt:shutterOpenTime
  191.                endingAt:shutterCloseTime];
  192. }
  193.  
  194. - preRenderSelf:(WW3DCamera *)camera
  195. {
  196.     return [ribCommandList preRenderSelf:camera];
  197. }
  198.  
  199. - transformCTM:(WW3DAttributeState *)attributeState
  200.     startingAt:(RtFloat)shutterOpenTime
  201.     endingAt:(RtFloat)shutterCloseTime 
  202. {
  203.     return [ribCommandList transformCTM:attributeState
  204.                            startingAt:shutterOpenTime
  205.                endingAt:shutterCloseTime]; 
  206. }
  207.  
  208. // methods to make me look like a compound command:
  209. - (int)count {  return [ribCommandList count]; }
  210. - objectAt:(int)i {  return [ribCommandList objectAt:i]; }
  211.  
  212.  
  213. // WavesWorld archiving:
  214. // writeEve:(NXStream *)stream
  215. // writeScene:(NXStream *)stream
  216.  
  217. - writeEve:(NXStream *)stream atTabLevel:(int)tab
  218. {
  219.     int  i;
  220.     
  221.     for (i = 0; i < tab; i++) {
  222.     NXPrintf(stream, "\t");
  223.     }
  224.     NXPrintf(stream, "WW3DHeightField %s %f ", imageName, zScale);
  225.     return self;
  226. }
  227.  
  228. - writeScene:(NXStream *)stream atTabLevel:(int)tab
  229. {
  230.   return [self writeEve:stream atTabLevel:tab];
  231. }
  232.  
  233. #define typeVector "*@f"
  234. #define typeValues &imageName, &image, &zScale
  235.  
  236. - read:(NXTypedStream *)stream 
  237. {
  238.     int version;
  239.     
  240.     [super read:stream];
  241.     version = NXTypedStreamClassVersion(stream,"WW3DHeightField");
  242.     if (version == 0) NXReadTypes(stream, "i", &version), version = 1;
  243.     if (version == 1)
  244.     {  NXReadTypes(stream, typeVector, typeValues);
  245.        NXReadArray(stream, "f", 6, boundingBox);
  246.        myShape = NXReadObject(stream);
  247.     }
  248.  
  249.     return self;
  250. }
  251.  
  252. - write:(NXTypedStream *)stream 
  253. {
  254.     [super write:stream];
  255.     NXWriteTypes(stream, typeVector, typeValues);
  256.     NXWriteArray(stream, "f", 6, boundingBox);
  257.     NXWriteObjectReference(stream, myShape);
  258.     return self;
  259. }
  260.  
  261. - (BOOL)theSameAs:otherRIBCommand
  262. {
  263.   // WAVE: really should try and return YES, but for now...
  264.   return NO;
  265. }
  266.  
  267. - (BOOL)isMoot
  268. {
  269.   return NO;
  270. }
  271.  
  272. // boy, this is dumb... This is to get around the stupid warnings from the compiler - ask wave for details
  273. - class { return [super class]; }
  274.  
  275.  
  276.  
  277. @end
  278.