diff --git a/src/AssetLoader.h b/src/AssetLoader.h index 84aff02..a69d3c4 100644 --- a/src/AssetLoader.h +++ b/src/AssetLoader.h @@ -3,17 +3,17 @@ #import #import #import "parser.h" -#import "Model.h" +#import "PhysObject.h" +#import "Renderer.h" -@interface AssetLoader : YSObject { - YSArray *drawables; +//need a way to differentiate different types of objects in asset file + +@interface AssetLoader : YSArray { } -//@property (copy) NSMutableArray *drawables; //-(id) init; --(void) draw; -(void) loadAssetFile: (const char *) path; --(void) printAllAssets; +-(void) sendObject: (id) obj to: (YSArray *) receiver; @end diff --git a/src/AssetLoader.m b/src/AssetLoader.m index 0c4ded2..806d709 100644 --- a/src/AssetLoader.m +++ b/src/AssetLoader.m @@ -3,25 +3,7 @@ @implementation AssetLoader //@synthesize drawables; --(id) init { - if ((self = [super init])) { - drawables = [[YSArray alloc] init]; - } - - return self; -} - --(void) draw { - int i; - for (i = 0; i < drawables->count; i++) { - //printf("i should be drawing: %p\n", drawables->array[i]); - [drawables->array[i] draw]; - } - return; -} - //game specific parts of the parser - enum { MDL = 0, TEX = 1, @@ -86,7 +68,7 @@ END: char *s; - NSModel *m; + PhysObject *m; for (line = get_next_line(file, 0); line != NULL; line = get_next_line(file, 0)) { //debug @@ -102,9 +84,11 @@ END: switch (r.type) { case MDL: //suck cock - m = [NSModel alloc]; - [m initWithModel: s]; + m = [PhysObject alloc]; + [m init]; + [m setModel: s]; break; + case TEX: [m setTexture: s]; break; @@ -112,25 +96,25 @@ END: SKIP_PATH: case POS: [m setPos: r.pos]; - [drawables addObject: m]; + [self addObject: m]; break; } } #ifdef DEBUG int i; - for (i = 0; i < drawables->count; i++) { - printf("%p\n", drawables->array[i]); - printf("%f %f %f\n", [drawables->array[i] pos].x, [drawables->array[i] pos].y, [drawables->array[i] pos].z); + for (i = 0; i < count; i++) { + printf("%p\n", array[i]); + printf("%f %f %f\n", [array[i] pos].x, [array[i] pos].y, [array[i] pos].z); } - printf("count: %d\n", drawables->count); - printf("capacity: %d\n", drawables->cap); + printf("count: %d\n", count); + printf("capacity: %d\n", cap); #endif } --(void) printAllAssets { - printf("capacity: %d\n", [drawables capacity]); +-(void) sendObject: (id) obj to: (YSArray *) receiver { + [receiver addObject: obj]; } @end \ No newline at end of file diff --git a/src/Gravitator.h b/src/Gravitator.h new file mode 100644 index 0000000..3aa665b --- /dev/null +++ b/src/Gravitator.h @@ -0,0 +1,25 @@ +#ifndef GRAVITY_H +#define GRAVITY_H + +//gravitator gravitates things + +#import +#import +#import "Activator.h" +#import "PhysObject.h" + +//F = M*A +//objects should have mass and a velocity vector + +//maybe change this to subclass of YSArray + +@interface Gravitator : YSArray { +@public + Vector3 acceleration; +} + +-(void) applyGravity; + +@end + +#endif \ No newline at end of file diff --git a/src/Gravitator.m b/src/Gravitator.m new file mode 100644 index 0000000..d9804e3 --- /dev/null +++ b/src/Gravitator.m @@ -0,0 +1,30 @@ +#import "Gravitator.h" + +static inline Vector3 multFloatVector3(float f, Vector3 v) { + return (Vector3){f * v.x, f * v.y, f * v.z}; +} + +@implementation Gravitator + +//apply gravity to all objects in array +-(void) applyGravity { + int i = 0; + + //receivers must have velocity vector + + for (i = 0; i < count; i++) { + + //cursed + + Vector3 force = multFloatVector3( [(PhysObject *)array[i] mass], acceleration); + printf("%f\n", [(PhysObject *)array[i] mass]); + + [(PhysObject *)array[i] setVelocity: Vector3Add(force, [(PhysObject *)array[i] velocity])]; + [(PhysObject *)array[i] setPos: Vector3Add( [(PhysObject *)array[i] velocity], [(PhysObject *)array[i] pos] )]; + //printf("%f %f %f\n", force.x, force.y, force.z ); + } + + +} + +@end \ No newline at end of file diff --git a/src/Model.h b/src/Model.h index 8f17621..c6271df 100644 --- a/src/Model.h +++ b/src/Model.h @@ -4,15 +4,18 @@ #import #import -@interface NSModel : YSObject { +@interface YSModel : YSObject { Model model; Texture texture; +@public Vector3 pos; float scale; } -(id) initWithModel: (const char *) path; -(id) initWithModel: (const char *) mdl_path andTexture: (const char *) tex_path; +-(void) setModel: (const char *) mdl_path; +-(Model) model; -(Vector3) pos; -(void) setPos: (Vector3) p; -(void) setTexture: (const char *) tex_path; diff --git a/src/Model.m b/src/Model.m index b9e5503..18f8a6b 100644 --- a/src/Model.m +++ b/src/Model.m @@ -1,6 +1,6 @@ #import "Model.h" -@implementation NSModel +@implementation YSModel -(id) initWithModel: (const char *) path { if ( (self = [super init]) ) { @@ -20,6 +20,14 @@ return self; } +-(void) setModel: (const char *) mdl_path { + model = LoadModel(mdl_path); +} + +-(Model) model { + return model; +} + -(Vector3) pos { return pos; } diff --git a/src/PhysObject.h b/src/PhysObject.h new file mode 100644 index 0000000..6804c2e --- /dev/null +++ b/src/PhysObject.h @@ -0,0 +1,20 @@ +#ifndef PHYSOBJECT_H +#define PHYSOBJECT_H + +#import "Model.h" + + +@interface PhysObject : YSModel { +@public + float mass; + Vector3 velocity; +} + +-(id) init; +-(Vector3) velocity; +-(void) setVelocity: (Vector3) v; +-(float) mass; +-(void) setMass: (float) m; + +@end +#endif \ No newline at end of file diff --git a/src/PhysObject.m b/src/PhysObject.m new file mode 100644 index 0000000..ad33d00 --- /dev/null +++ b/src/PhysObject.m @@ -0,0 +1,31 @@ +#import "PhysObject.h" + +@implementation PhysObject + +-(id) init { + self = [super init]; + + if (self) { + mass = 1.0f; + } + + return self; +} + +-(Vector3) velocity { + return velocity; +} + +-(void) setVelocity: (Vector3) v { + velocity = v; +} + +-(float) mass { + return mass; +} + +-(void) setMass: (float) m { + mass = m; +} + +@end \ No newline at end of file diff --git a/src/Renderer.h b/src/Renderer.h new file mode 100644 index 0000000..0efb10a --- /dev/null +++ b/src/Renderer.h @@ -0,0 +1,20 @@ +#ifndef RENDERER_H +#define RENDERER_H + +#import + +/* + the main loop may have two or more renderers, + one for the 3D section, and another for the + 2D section. +*/ + +@interface Renderer : YSArray { + +} + +-(void) render; + +@end + +#endif \ No newline at end of file diff --git a/src/Renderer.m b/src/Renderer.m new file mode 100644 index 0000000..63fd254 --- /dev/null +++ b/src/Renderer.m @@ -0,0 +1,13 @@ +#import "Renderer.h" + +@implementation Renderer + +-(void) render { + int i; + + for (i = 0; i < count; i++) { + [array[i] draw]; + } +} + +@end \ No newline at end of file diff --git a/src/main.m b/src/main.m index bb464fc..1c2ce6a 100644 --- a/src/main.m +++ b/src/main.m @@ -7,6 +7,9 @@ //#import "SoundPlayer.h" #import "InputHandler.h" #import "AssetLoader.h" +#import "Renderer.h" +#import "Gravitator.h" +#import "PhysObject.h" #import "properties.h" const int winWidth = 800; @@ -33,19 +36,30 @@ int main(int argc, const char *argv[]) { //Enemy *enemy = [[Enemy alloc] init]; InputHandler *input = [[InputHandler alloc] init]; AssetLoader *assetLoader = [[AssetLoader alloc] init]; + Renderer *renderer = [[Renderer alloc] init]; + Gravitator *gravitator = [[Gravitator alloc] init]; input->controllable = player; + gravitator->acceleration = (Vector3){0.0f, -1.0f, 0.0f}; + //player.soundPlayer = sp; [camera attach: player]; [assetLoader loadAssetFile: "assets.al"]; + int i; + for (i = 0; i < assetLoader->count; i++) { + [assetLoader sendObject: assetLoader->array[i] to: renderer]; + [assetLoader sendObject: assetLoader->array[i] to: gravitator]; + } + while (!WindowShouldClose()) { [camera update]; //hard coded input handler [input handleInput]; + [gravitator applyGravity]; BeginDrawing(); ClearBackground(RAYWHITE); @@ -55,7 +69,7 @@ int main(int argc, const char *argv[]) { DrawCube((Vector3){ 16.0f, 2.5f, 0.0f }, 1.0f, 5.0f, 32.0f, LIME); // Draw a green wall DrawCube((Vector3){ 0.0f, 2.5f, 16.0f }, 32.0f, 5.0f, 1.0f, GOLD); DrawCube((Vector3){ 0.0f, 2.5f, -16.0f }, 32.0f, 5.0f, 1.0f, RED); - [assetLoader draw]; + [renderer render]; EndMode3D();