plane_hits
function in Objective-C
plane_t
object's hits
method. Recall that because
plane_t
subscribes to object_t
<intersecting>
protocol, it must implement
the hits
method:
- (double) hits: (vec_t *) _pos: (vec_t *) _dir: (vec_t **) _hit: (vec_t **) _N;
test_hits()
function is now object-oriented in the
sense that it does not set the obj
's last_hit
data member to 0
via memset
, but rather
asks obj
to set its last_hit
to
0.0: 0.0: 0.0
(internally, object_t
asks its last_hit
, which is a vec_t
to set itself via the latter's set:
method).
UPDATE: Since rewriting the object_find_closest
and
the hits
functions, we don't really care
anymore about the object's last_hit
data member.
It's still there for legacy reasons but may probably be
removed without harm.
void test_hits(object_t *obj, vec_t *pos, vec_t *dir)
{
double dis=0.0;
vec_t *hit = [(vec_t *)[vec_t alloc] init];
vec_t *N = [(vec_t *)[vec_t alloc] init];
[obj setlast_hit: 0.0: 0.0: 0.0];
dis = [obj hits: pos: [dir unit]: &hit: &N];
fprintf(stderr,"dis to plane %s %8.3lf \n",[[obj getname] UTF8String],dis);
// old way of doing it
//[[obj getlast_hit] write: stderr: "hit point"];
// new way
[hit write: stderr: "hit point"];
}
main()
function now makes use of Objective-C objects:
int main(int argc, const char *argv[])
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
list_t *mats = [(list_t *)[list_t alloc] init];
list_t *objs = [(list_t *)[list_t alloc] init];
material_t *mat = nil;
object_t *obj = nil;
vec_t *pos = [(vec_t *)[vec_t alloc] init: 4.0: 3.0: 5.0];
vec_t *dir = [(vec_t *)[vec_t alloc] init: 0.0: 0.0: -1.0];
int firsttime=1;
char token[16];
NSMutableString *str = nil;
NSLog(@"main start");
NSLog(@"reading stdin");
// input consist of material or object definitions and
// there can be any number of them in the file
while(fscanf(stdin,"%s",token)==1) {
if(!strcmp(token,"material")) {
// create material_t object, read attributes, add to list
mat = [(material_t *)[material_t alloc] init];
[mat read: stdin];
[mats add: mat];
// this test is designed to ensure that list_add
// pointed current to the material just loaded
mat = [mats data];
assert([mat getcookie] == MAT_COOKIE);
fprintf(stderr,"loaded %s\n",[[mat getname] UTF8String]);
}
if(!strcmp(token,"plane")) {
// create plane_t object, read attributes, add to list
obj = [(plane_t *)[plane_t alloc] init];
str = [[NSMutableString alloc] initWithUTF8String: token];
[obj settype: str];
[obj read: stdin: mats];
[objs add: obj];
// this test is designed to ensure that list_add
// pointed current to the material just loaded
obj = [objs data];
assert([obj getcookie] == OBJ_COOKIE);
fprintf(stderr,"loaded %s\n",[[obj getname] UTF8String]);
// test hits function
[pos set: 4.0: 3.0: 5.0];
[dir set: 0.0: 0.0: -1.0];
test_hits(obj,pos,dir);
if(firsttime) {
// make sure we don't get a hit on a miss..shoot
// straight down at backwall
fprintf(stderr,"vertical ray test\n");
[pos set: 4.0: 3.0: 5.0];
[dir set: 0.0: -2.1: 0.0];
test_hits(obj,pos,dir);
firsttime = 1-firsttime;
} else {
// make sure we don't get a hit in +z space
fprintf(stderr,"positive z test\n");
[pos set: 4.0: 3.0: 5.0];
[dir set: 0.0: -2.1: -1.0];
test_hits(obj,pos,dir);
}
}
}
NSLog(@"done reading stdin");
[mats write: stdout];
[objs write: stdout];
[str release];
[pool drain];
return 0;
}
material green { ambient 0 5 0 } material brown { ambient 3 3 0 } plane wall { material green normal 0 0 1 point 0 0 -7 } plane floor { material brown normal 0 1 1 point 0 0 -7 }
2013-02-12 11:07:53.511 main[59704:903] main start 2013-02-12 11:07:53.513 main[59704:903] reading stdin loaded green loaded brown loaded wall dis to plane wall 12.000 hit point 4 3 -7 vertical ray test dis to plane wall -1.000 hit point 0 0 0 loaded floor dis to plane floor 15.000 hit point 4 3 -10 positive z test dis to plane floor -1.000 hit point 0 0 0 2013-02-12 11:07:53.514 main[59704:903] done reading stdin material green { ambient 0 5 0 } material brown { ambient 3 3 0 } plane wall { material green normal 0 0 1 point 0 0 -7 } plane floor { material brown normal 0 1 1 point 0 0 -7 }
tar.gz
archive of your asg5/ directory, including:
README
file containing
Makefile
.h
headers and .c
source)
make clean
before tar
)
submit
notes.