| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- #define SAF_PROGRAM_NAME "tpe1"
- #define SAF_PLATFORM_POKITTO
- #define SAF_SETTING_ENABLE_SOUND 0
- #define SAF_SETTING_ENABLE_SAVES 0
- #define S3L_RESOLUTION_X SAF_SCREEN_WIDTH
- #define S3L_RESOLUTION_Y SAF_SCREEN_HEIGHT
- #define S3L_PIXEL_FUNCTION s3l_drawPixel
- #include "saf.h"
- #define S3L_Z_BUFFER 0
- #define S3L_SORT 1
- #define S3L_FLAT 1
- #define S3L_NEAR_CROSS_STRATEGY 1
- #define ROOM_SIZE (30 * TPE_F)
- #define TPE_RESHAPE_ITERATIONS 2
- #define TPE_APPROXIMATE_NET_SPEED 1
- #include "../tinyphysicsengine.h"
- #include "../programs/small3dlib.h"
- TPE_World tpe_world;
- TPE_Joint tpe_joints[30];
- TPE_Connection tpe_connections[35];
- TPE_Body tpe_bodies[4];
- static const S3L_Unit s3l_cubeVertices[S3L_CUBE_VERTEX_COUNT * 3] = { S3L_CUBE_VERTICES(S3L_FRACTIONS_PER_UNIT) };
- static const S3L_Index s3l_cubeTriangles[S3L_CUBE_TRIANGLE_COUNT * 3] = { S3L_CUBE_TRIANGLES };
- S3L_Model3D s3l_models[3];
- S3L_Scene s3l_scene;
- uint8_t debugDraw = 0;
- void tpe_debugDrawPixel(uint16_t x, uint16_t y, uint8_t color)
- {
- SAF_drawPixel(x,y,(color + 2) * 32 + color);
- }
- TPE_Vec3 tpe_environmentDistance(TPE_Vec3 p, TPE_Unit maxD)
- {
- return TPE_envAABoxInside(p,TPE_vec3(0,0,0),
- TPE_vec3(ROOM_SIZE,ROOM_SIZE,ROOM_SIZE));
- }
- static uint8_t sideColors[12] =
- { 32, 32, 64, 64, 96, 96, 128, 128, 160, 160, 192, 192 };
- uint8_t colorAdd;
- void s3l_drawPixel(S3L_PixelInfo *p)
- {
- SAF_drawPixel(p->x,p->y,sideColors[p->triangleIndex] + colorAdd);
- }
- void SAF_init(void)
- {
- S3L_model3DInit(s3l_cubeVertices,S3L_CUBE_VERTEX_COUNT,s3l_cubeTriangles,S3L_CUBE_TRIANGLE_COUNT,&s3l_models[0]);
- s3l_models[0].transform.scale.x = 3 * S3L_FRACTIONS_PER_UNIT;
- s3l_models[0].transform.scale.y = s3l_models[0].transform.scale.x;
- s3l_models[0].transform.scale.z = s3l_models[0].transform.scale.x;
- s3l_models[1] = s3l_models[0];
- s3l_models[2] = s3l_models[0];
- s3l_models[2].transform.scale.x = ROOM_SIZE;
- s3l_models[2].transform.scale.y = ROOM_SIZE;
- s3l_models[2].transform.scale.z = ROOM_SIZE;
- s3l_models[2].config.backfaceCulling = 1;
- s3l_models[2].triangleCount -= 2;
- S3L_sceneInit(s3l_models,2,&s3l_scene);
- s3l_scene.camera.transform.rotation.x -= TPE_F / 16;
- TPE_makeBox(tpe_joints,tpe_connections,
- 2 * TPE_F,2 * TPE_F,2 * TPE_F,TPE_F);
- TPE_bodyInit(&tpe_bodies[0],tpe_joints,8,tpe_connections,16,TPE_F);
- TPE_makeBox(tpe_joints + 8,tpe_connections + 16,
- 2 * TPE_F,2 * TPE_F,2 * TPE_F,TPE_F);
- TPE_bodyInit(&tpe_bodies[1],tpe_joints + 8,8,tpe_connections + 16,16,TPE_F);
- TPE_bodyMoveBy(&tpe_bodies[1],TPE_vec3(4 * TPE_F,0,0));
- TPE_worldInit(&tpe_world,tpe_bodies,2,tpe_environmentDistance);
- }
- uint8_t SAF_loop(void)
- {
- SAF_clearScreen(SAF_COLOR_GRAY);
- TPE_worldStep(&tpe_world);
- for (uint8_t i = 0; i < tpe_world.bodyCount; ++i)
- TPE_bodyApplyGravity(&tpe_world.bodies[i],TPE_F / 50);
- for (uint8_t i = 0; i < 2; ++i)
- {
- s3l_models[i].transform.translation.x =
- (tpe_bodies[i].joints[0].position.x +
- tpe_bodies[i].joints[7].position.x) / 2;
- s3l_models[i].transform.translation.y =
- (tpe_bodies[i].joints[0].position.y +
- tpe_bodies[i].joints[7].position.y) / 2;
- s3l_models[i].transform.translation.z =
- (tpe_bodies[i].joints[0].position.z +
- tpe_bodies[i].joints[7].position.z) / 2;
- TPE_Vec3 orient = TPE_bodyGetRotation(&tpe_bodies[i],0,1,2);
- s3l_models[i].transform.rotation.x = orient.x;
- s3l_models[i].transform.rotation.y = orient.y;
- s3l_models[i].transform.rotation.z = orient.z;
- }
- S3L_newFrame();
- colorAdd = 19;
- s3l_scene.models = s3l_models + 2;
- s3l_scene.modelCount = 1;
- S3L_drawScene(s3l_scene);
- colorAdd = 0;
- S3L_newFrame();
- s3l_scene.models = s3l_models;
- s3l_scene.modelCount = 2;
- S3L_drawScene(s3l_scene);
- if (SAF_buttonJustPressed(SAF_BUTTON_C))
- debugDraw = !debugDraw;
- if (debugDraw)
- TPE_worldDebugDraw(&tpe_world,tpe_debugDrawPixel,
- TPE_vec3(
- s3l_scene.camera.transform.translation.x,
- s3l_scene.camera.transform.translation.y,
- s3l_scene.camera.transform.translation.z),
- TPE_vec3(s3l_scene.camera.transform.rotation.x,s3l_scene.camera.transform.rotation.y,0),
- TPE_vec3(SAF_SCREEN_WIDTH,SAF_SCREEN_HEIGHT,TPE_F),4,TPE_F);
- s3l_scene.camera.transform.translation = s3l_models[0].transform.translation;
- s3l_scene.camera.transform.translation.y += 3 * TPE_F;
- s3l_scene.camera.transform.translation.z -= 5 * TPE_F;
- #define ACC 20
- if (SAF_buttonPressed(SAF_BUTTON_LEFT))
- TPE_bodyAccelerate(&tpe_world.bodies[0],TPE_vec3(-1 * ACC,0,0));
- else if (SAF_buttonPressed(SAF_BUTTON_RIGHT))
- TPE_bodyAccelerate(&tpe_world.bodies[0],TPE_vec3(ACC,0,0));
- else if (SAF_buttonPressed(SAF_BUTTON_UP))
- TPE_bodyAccelerate(&tpe_world.bodies[0],TPE_vec3(0,0,ACC));
- else if (SAF_buttonPressed(SAF_BUTTON_DOWN))
- TPE_bodyAccelerate(&tpe_world.bodies[0],TPE_vec3(0,0,-1 * ACC));
- if (SAF_buttonJustPressed(SAF_BUTTON_A))
- TPE_bodyAccelerate(&tpe_world.bodies[0],TPE_vec3(0,20 * ACC,0));
- #undef ACC
- return 1;
- }
|