This is Branch.m in view mode; [Download] [Up]
// Branch.m -- major constituent of tree
#import "Branch.h"
#import "Tree.h"
#import "ForestCamera.h"
#import <ri/ri.h>
#import <math.h>
@implementation Branch:N3DShape
id globalShader;
- tree :treeArg {tree = treeArg; return self;}
- addBranches :(int)level inTree :treeArg
{ Branch *aBranch, *firstBranch=0;
Tree *myTree = tree;
RtPoint xAxis = {1.0, 0.0, 0.0};
RtPoint zAxis = {0.0, 0.0, 1.0};
int i, bf = [myTree randVal :BRANCHFACTOR]; // number of branches
float twi = [myTree randVal :TWIST];
if (level >= (i=[myTree randVal :LEVELS]))
return self;
for (i=0; i<bf; i++)
{ float shr = [myTree randVal :SHRINK];
float ang = [myTree randVal :ANGLE];
float tra = 0.90; // translation
static float k = 2.0*M_PI/360.0;
float x0=0.0, y0=0.0, z0=tra, x1, y1, z1;
aBranch = [[Branch alloc] init];
if (i == 0)
[self linkDescendant :firstBranch=aBranch];
else
[firstBranch linkPeer :aBranch];
[aBranch tree :treeArg];
[aBranch setShader :globalShader];
[aBranch rotateAngle :ang axis :xAxis];
[aBranch rotateAngle :twi + 360.0*i/bf axis :zAxis];
[aBranch scaleUniformly :shr];
[aBranch translate :0.0 :0.0 :tra];
if ((x1 = shr*sin(ang*k)*sin(twi*k)) < 0) { x0 = x1; x1 = 0.0;}
if ((y1 = shr*sin(ang*k)*cos(twi*k)) < 0) { y0 = y1; y1 = 0.0;}
if ((z1 = tra + shr*cos(ang*k)) < tra) { z0 = z1; z1 = tra;}
[aBranch setBoundingBox :x0 :x1 :y0 :y1 :z0 :z1];
[aBranch addBranches :level+1 inTree :treeArg];
}
return self;
}
- setBoundingBox :(float)xMin :(float)xMax :(float)yMin :(float)yMax
:(float)zMin :(float)zMax
{ boundingBox[0] = xMin;
boundingBox[1] = xMax;
boundingBox[2] = yMin;
boundingBox[3] = yMax;
boundingBox[4] = zMin;
boundingBox[5] = zMax;
return self;
}
- renderSelf:(RtToken)context
{ RiCylinder( .1, .1, 1, 360, RI_NULL);
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.