Exemplo n.º 1
0
Arquivo: physics.c Projeto: dns/CLove
int l_physics_newShape(lua_State* state)
{

    l_tools_checkUserDataPlusErrMsg(state, 1, "You must provide a space");
    l_tools_checkUserDataPlusErrMsg(state, 2, "You must provide a body");

    l_physics_PhysicsData* physics = (l_physics_PhysicsData*)lua_touserdata(state, 1);
    l_physics_Body* body = (l_physics_Body*)lua_touserdata(state, 2);

    float x1 = l_tools_toNumberOrError(state, 3);
    float y1 = l_tools_toNumberOrError(state, 4);
    float x2 = l_tools_toNumberOrError(state, 5);
    float y2 = l_tools_toNumberOrError(state, 6);
    float radius = l_tools_toNumberOrError(state, 7);

    moduleData.shape = (l_physics_Shape*)lua_newuserdata(state, sizeof(l_physics_Shape));

    moduleData.shape->physics = malloc(sizeof(physics_PhysicsData));
    moduleData.shape->physics = physics->physics;

    moduleData.shape->shape = cpSpaceAddShape(physics->physics->space, cpSegmentShapeNew(body->body, cpv(x1, y1), cpv(x2, y2), radius));

    lua_rawgeti(state, LUA_REGISTRYINDEX, moduleData.shapeMT);
    lua_setmetatable(state, -2);

    return 1;
}
Exemplo n.º 2
0
static int l_geometry_rectangle(lua_State* state) {
  const char* type = l_tools_toStringOrError(state, 1);
  float x = l_tools_toNumberOrError(state, 2);
  float y = l_tools_toNumberOrError(state, 3);
  float w = l_tools_toNumberOrError(state, 4);
  float h = l_tools_toNumberOrError(state, 5);
  float r = 0;
  if (lua_tonumber(state, 6)) r = luaL_checknumber(state, 6);
  float sx = 1;
  if (lua_tonumber(state, 7)) sx = luaL_checknumber(state, 7);
  float sy = 1;
  if (lua_tonumber(state, 8)) sy = luaL_checknumber(state, 8);
  float ox = 0;
  if (lua_tonumber(state, 9)) ox = luaL_checknumber(state, 9);
  float oy = 0;
  if (lua_tonumber(state, 10)) oy = luaL_checknumber(state, 10);

  if (strncmp(type,"line",4) == 0)
    graphics_geometry_fillRectangle(0, x, y, w, h, r, sx, sy, ox, oy);

  else if(strncmp(type,"fill", 4) == 0)
    graphics_geometry_fillRectangle(1, x, y, w, h, r, sx, sy, ox, oy);
  else
    {
      luaL_argerror(state,1,"expected string");
      lua_error(state);
    }
  return 1;
}
Exemplo n.º 3
0
static int l_graphics_printf(lua_State* state) {
  if(!moduleData.currentFont) {
    l_graphics_loadDefaultFont();
  }

  char const* text = lua_tostring(state, 1);
  if(!text) {
    lua_pushstring(state, "string or number required");
    return lua_error(state);
  }
  int x = l_tools_toNumberOrError(state, 2);
  int y = l_tools_toNumberOrError(state, 3);
  int limit = l_tools_toNumberOrError(state, 4);
  // TODO
  graphics_TextAlign align = graphics_TextAlign_left;
  if(!lua_isnoneornil(state, 5)) {
    align = l_tools_toEnumOrError(state, 5, l_graphics_AlignMode);
  }

  float r = luaL_optnumber(state, 6, 0);
  float sx = luaL_optnumber(state, 7, 1.0f);
  float sy = luaL_optnumber(state, 8, sx);
  float ox = luaL_optnumber(state, 9, 0);
  float oy = luaL_optnumber(state, 10, 0);
  float kx = luaL_optnumber(state, 11, 0);
  float ky = luaL_optnumber(state, 12, 0);

  graphics_Font_printf(moduleData.currentFont, text, x, y, limit, align, r, sx, sy, ox, oy, kx, ky);

  return 0;
}
Exemplo n.º 4
0
Arquivo: physics.c Projeto: dns/CLove
int l_physics_newSpace(lua_State* state)
{

    moduleData.onBegin = false;
    moduleData.onPostSolve = false;
    moduleData.onPreSolve = false;
    moduleData.onSeparate = false;

    //moduleData.letBeginCollide = true;
    //moduleData.letPreSolveCollide = true;

    float x = l_tools_toNumberOrError(state, 1);
    float y = l_tools_toNumberOrError(state, 2);

    moduleData.physics = (l_physics_PhysicsData*)lua_newuserdata(state, sizeof(l_physics_PhysicsData));
    moduleData.physics->physics = malloc(sizeof(physics_PhysicsData));

    moduleData.physics->physics->space = cpSpaceNew();
    moduleData.physics->physics->gravity = cpv(x, y);
    cpSpaceSetGravity(moduleData.physics->physics->space, moduleData.physics->physics->gravity);

    lua_rawgeti(state, LUA_REGISTRYINDEX, moduleData.physicsMT);
    lua_setmetatable(state, -2);

    return 1;
}
Exemplo n.º 5
0
static int l_graphics_Mesh_setVertexMap(lua_State *state) {
  l_assertType(state, 1, l_graphics_isMesh);
  l_graphics_Mesh *mesh = l_graphics_toMesh(state, 1);
  
  size_t top = (size_t)lua_gettop(state);
  if(top == 1) {
    graphics_Mesh_setVertexMap(&mesh->mesh, 0, 0);
    return 0;
  } 
  
  size_t count;
  if(top > 2) {
    ensureBufferSize(sizeof(uint32_t) * (top - 1));
    for(int i = 0; i < top - 1; ++i) {
      ((uint32_t*)moduleData.buffer)[i] = (uint32_t)l_tools_toNumberOrError(state, i + 2) - 1;
      printf("Index: %d\n", ((uint32_t*)moduleData.buffer)[i]);
    }
    count = top - 1;
  } else {
    size_t len = (size_t)lua_objlen(state, 2);
    ensureBufferSize(len * sizeof(uint32_t));
    for(int i = 0; i < len; ++i) {
      lua_rawgeti(state, 2, i+1);
      ((uint32_t*)moduleData.buffer)[i] = (uint32_t)l_tools_toNumberOrError(state, -1) - 1;
    }
    count = len;
  }

  graphics_Mesh_setVertexMap(&mesh->mesh, count, (uint32_t*)moduleData.buffer);

  return 0;
}
Exemplo n.º 6
0
Arquivo: physics.c Projeto: dns/CLove
int l_physics_newCircleShape(lua_State* state)
{

    l_tools_checkUserDataPlusErrMsg(state, 1, "You must provide a space!");
    l_physics_PhysicsData* physics = (l_physics_PhysicsData*)lua_touserdata(state, 1);
    l_tools_checkUserDataPlusErrMsg(state, 2, "You must provide a body");
    l_physics_Body* body = (l_physics_Body*)lua_touserdata(state, 2);

    float radius = l_tools_toNumberOrError(state, 3);
    cpVect offset = cpvzero;
    offset.x = l_tools_toNumberOrError(state, 4);
    offset.y = l_tools_toNumberOrError(state, 5);

    moduleData.shape = (l_physics_Shape*)lua_newuserdata(state, sizeof(l_physics_Shape));
    moduleData.shape->physics = malloc(sizeof(physics_PhysicsData));
    moduleData.shape->physics = physics->physics;

    moduleData.shape->shape = cpSpaceAddShape(physics->physics->space, cpCircleShapeNew(body->body, radius, offset));

    lua_rawgeti(state, LUA_REGISTRYINDEX, moduleData.shapeMT);
    lua_setmetatable(state, -2);


    return 1;
}
Exemplo n.º 7
0
static int l_geometry_points(lua_State* state) {
  float x = l_tools_toNumberOrError(state, 1);
  float y = l_tools_toNumberOrError(state, 2);
  
  graphics_geometry_points(x,y);

  return 1;
}
Exemplo n.º 8
0
Arquivo: physics.c Projeto: dns/CLove
static int l_physics_setBodyCenterOfGravity(lua_State* state)
{
    l_tools_checkUserDataPlusErrMsg(state, 1, "You must provide a body");
    l_physics_Body* body = (l_physics_Body*)lua_touserdata(state, 1);

    cpVect value = cpvzero;
    value.x = l_tools_toNumberOrError(state, 2);
    value.y = l_tools_toNumberOrError(state, 3);

    cpBodySetCenterOfGravity(body->body, value);

    return 0;
}
Exemplo n.º 9
0
static int l_geometry_circle(lua_State* state) {
  const char* type = l_tools_toStringOrError(state, 1);
  float x = l_tools_toNumberOrError(state, 2);
  float y = l_tools_toNumberOrError(state, 3);
  float radius = l_tools_toNumberOrError(state, 4);
  float segments = l_tools_toNumberOrError(state, 5);

  if (strncmp(type,"line",4) == 0)
    graphics_geometry_drawCircle(x, y, radius, segments);
  else if(strncmp(type,"fill", 4) == 0)
    graphics_geometry_fillCircle(x, y, radius, segments);
  return 1;
}
Exemplo n.º 10
0
Arquivo: physics.c Projeto: dns/CLove
static int l_physics_setBodyVelocity(lua_State* state)
{
    l_tools_checkUserDataPlusErrMsg(state, 1, "You must provide a body");
    l_physics_Body* body = (l_physics_Body*)lua_touserdata(state, 1);

    cpVect vec = cpvzero;
    vec.x = l_tools_toNumberOrError(state, 2);
    vec.y = l_tools_toNumberOrError(state, 3);

    cpBodySetVelocity(body->body, vec);

    return 0;
}
Exemplo n.º 11
0
Arquivo: physics.c Projeto: dns/CLove
static int l_physics_onPreSolve(lua_State* state)
{
    l_physics_PhysicsData* data = (l_physics_PhysicsData*)lua_touserdata(state, 1);

    uint32_t a_type = l_tools_toNumberOrError(state, 2);
    uint32_t b_type = l_tools_toNumberOrError(state, 3);

    moduleData.handler = cpSpaceAddCollisionHandler(data->physics->space, a_type, b_type);
    moduleData.handler->preSolveFunc = preSolve;

    lua_pushboolean(state, moduleData.onPreSolve);
    moduleData.onPreSolve = false;

    return 1;
}
Exemplo n.º 12
0
static int l_graphics_SpriteBatch_set(lua_State* state) {
  l_assertType(state, 1, l_graphics_isBatch);

  l_graphics_Batch * batch = l_graphics_toBatch(state, 1);

  int id = l_tools_toNumberOrError(state, 2);

  graphics_Quad const * quad = &defaultQuad;
  int baseidx = 3;

  if(l_graphics_isQuad(state, 3)) {
    quad = l_graphics_toQuad(state, 3);
    baseidx = 4;
  }

  float x  = luaL_optnumber(state, baseidx,     0.0f);
  float y  = luaL_optnumber(state, baseidx + 1, 0.0f);
  float r  = luaL_optnumber(state, baseidx + 2, 0.0f);
  float sx = luaL_optnumber(state, baseidx + 3, 1.0f);
  float sy = luaL_optnumber(state, baseidx + 4, sx);
  float ox = luaL_optnumber(state, baseidx + 5, 0.0f);
  float oy = luaL_optnumber(state, baseidx + 6, 0.0f);
  float kx = luaL_optnumber(state, baseidx + 7, 0.0f);
  float ky = luaL_optnumber(state, baseidx + 8, 0.0f);

  //graphics_Batch_set(&batch->batch, id, quad, x, y, r, sx, sy, ox, oy, kx, ky);

  return 0;
}
Exemplo n.º 13
0
static int l_audio_SourceCommon_setVolume(lua_State *state) {
  l_assertType(state, 1, isSource);
  float gain = l_tools_toNumberOrError(state, 2);
  audio_SourceCommon *source = (audio_SourceCommon*)lua_touserdata(state, 1);
  audio_SourceCommon_setVolume(source, gain);
  return 0;
}
Exemplo n.º 14
0
static int l_graphics_Quad_setViewport(lua_State* state) {
  l_assertType(state, 1, l_graphics_isQuad);

  graphics_Quad *quad = l_graphics_toQuad(state, 1);
  
  float x = l_tools_toNumberOrError(state, 2);
  float y = l_tools_toNumberOrError(state, 3);
  float w = l_tools_toNumberOrError(state, 4);
  float h = l_tools_toNumberOrError(state, 5);

  quad->x = x;
  quad->y = y;
  quad->w = w;
  quad->h = h;

  return 0;
}
Exemplo n.º 15
0
static int l_graphics_Mesh_setDrawRange(lua_State *state) {
  l_assertType(state, 1, l_graphics_isMesh);
  l_graphics_Mesh * mesh = l_graphics_toMesh(state, 1);

  int top = lua_gettop(state);
  if(top == 3) {
    int idx1 = l_tools_toNumberOrError(state, 2) - 1;
    int idx2 = l_tools_toNumberOrError(state, 3) - 1;
    graphics_Mesh_setDrawRange(&mesh->mesh, idx1, idx2);
  } else if(top == 1) {
    graphics_Mesh_resetDrawRange(&mesh->mesh);
  } else {
    lua_pushstring(state, "Need none or two numbers");
    return lua_error(state);
  }

  return 0;
}
Exemplo n.º 16
0
int l_graphics_SpriteBatch_setColor(lua_State* state) {
  l_assertType(state, 1, l_graphics_isBatch);

  l_graphics_Batch * batch = l_graphics_toBatch(state, 1);

  if(!lua_isnumber(state, 2)) {
    graphics_Batch_clearColor(&batch->batch);
  } else {
    float r = l_tools_toNumberOrError(state, 2);
    float g = l_tools_toNumberOrError(state, 3);
    float b = l_tools_toNumberOrError(state, 4);
    float a = luaL_optnumber(state, 5, 255);
    graphics_Batch_setColor(&batch->batch, r / 255.0f, g / 255.0f, b / 255.0f, a / 255.0f);
  }


  return 0;
}
Exemplo n.º 17
0
static int l_filesystem_compare(lua_State* state)  {
  const char* a = l_tools_toStringOrError(state, 1);
  const char* b = l_tools_toStringOrError(state, 2);
  int l = l_tools_toNumberOrError(state, 3);
  if ( filesystem_compare(a, b, l))
    lua_pushboolean(state, 1);
  else
    lua_pushboolean(state, 0);
  return 1;
}
Exemplo n.º 18
0
Arquivo: physics.c Projeto: dns/CLove
static int l_physics_setShapeMass(lua_State* state)
{
    l_physics_Shape* shape = (l_physics_Shape*)lua_touserdata(state, 1);

    float value = l_tools_toNumberOrError(state, 2);

    cpShapeSetMass(shape->shape, value);

    return 0;
}
Exemplo n.º 19
0
static int l_graphics_Mesh_setVertex(lua_State* state) {
  l_assertType(state, 1, l_graphics_isMesh);
  l_graphics_Mesh * mesh = l_graphics_toMesh(state, 1);

  size_t index = l_tools_toNumberOrError(state, 2) - 1;

  graphics_Vertex v;
  float *vf = (float*)&v;
  for(int i = 0; i < 4; ++i) {
    vf[i] = l_tools_toNumberOrError(state, i+3);
  }
  for(int i = 4; i < 8; ++i) {
    vf[i] = luaL_optnumber(state, i+3, 255.0f) / 255.0f;
  }

  graphics_Mesh_setVertex(&mesh->mesh, index, &v);

  return 0;
}
Exemplo n.º 20
0
Arquivo: audio.c Projeto: dns/CLove
static int l_audio_SourceCommon_setPitch(lua_State *state) {
	float pitch = l_tools_toNumberOrError(state, 2);
	if (moduleData.audio_type == audio_type_stream){
		audio_StreamSource* source = (audio_StreamSource *)lua_touserdata(state, 1);
		audio_StreamSource_setPitch(source, pitch);
	} else {
		audio_SourceCommon* source = (audio_SourceCommon*)lua_touserdata(state, 1);
		audio_SourceCommon_setPitch(source, pitch);
	}
	return 1;
}
Exemplo n.º 21
0
int l_graphics_SpriteBatch_setBufferSize(lua_State* state) {
  l_assertType(state, 1, l_graphics_isBatch);

  l_graphics_Batch * batch = l_graphics_toBatch(state, 1);

  int newsize = l_tools_toNumberOrError(state, 2);

  graphics_Batch_changeBufferSize(&batch->batch, newsize);

  return 0;
}
Exemplo n.º 22
0
Arquivo: physics.c Projeto: dns/CLove
static int l_physics_setSpaceDamping(lua_State* state)
{
    l_tools_checkUserDataPlusErrMsg(state, 1, "You must provide a space");
    l_physics_PhysicsData* physics = (l_physics_PhysicsData*)lua_touserdata(state, 1);

	float damping = l_tools_toNumberOrError(state, 2);

    cpSpaceSetDamping(physics->physics->space, damping);

	return 0;
}
Exemplo n.º 23
0
static int l_graphics_Font_getWrap(lua_State* state) {
  l_assertType(state, 1, l_graphics_isFont);

  graphics_Font* font = l_graphics_toFont(state, 1);

  char const* line = l_tools_toStringOrError(state, 2);
  int width = l_tools_toNumberOrError(state, 3);

  lua_pushinteger(state, graphics_Font_getWrap(font, line, width, NULL));
  return 1;
}
Exemplo n.º 24
0
Arquivo: physics.c Projeto: dns/CLove
static int l_physics_setBodyTorque(lua_State* state)
{
    l_tools_checkUserDataPlusErrMsg(state, 1, "You must provide a body");
    l_physics_Body* body = (l_physics_Body*)lua_touserdata(state, 1);

    float value = l_tools_toNumberOrError(state, 2);

    cpBodySetTorque(body->body, value);

    return 0;
}
Exemplo n.º 25
0
Arquivo: physics.c Projeto: dns/CLove
static int l_physics_setSpaceSleepTime(lua_State* state)
{

    l_tools_checkUserDataPlusErrMsg(state, 1, "You must provide a space");
    l_physics_PhysicsData* physics = (l_physics_PhysicsData*)lua_touserdata(state, 1);

    float sleep = l_tools_toNumberOrError(state, 2);

    cpSpaceSetSleepTimeThreshold(physics->physics->space, sleep);

    return 0;
}
Exemplo n.º 26
0
static int l_graphics_print(lua_State* state) {
  if(!moduleData.currentFont) {
    l_graphics_loadDefaultFont();
  }
  char const* text = lua_tostring(state, 1);
  if(!text) {
    lua_pushstring(state, "need string");
    return lua_error(state);
  }
  int x = l_tools_toNumberOrError(state, 2);
  int y = l_tools_toNumberOrError(state, 3);

  float r = luaL_optnumber(state, 4, 0);
  float sx = luaL_optnumber(state, 5, 1.0f);
  float sy = luaL_optnumber(state, 6, sx);
  float ox = luaL_optnumber(state, 7, 0);
  float oy = luaL_optnumber(state, 8, 0);
  float kx = luaL_optnumber(state, 9, 0);
  float ky = luaL_optnumber(state, 10, 0);

  graphics_Font_render(moduleData.currentFont, text, x, y, r, sx, sy, ox, oy, kx, ky);
  return 0;
}
Exemplo n.º 27
0
Arquivo: physics.c Projeto: dns/CLove
static int l_physics_setBodyPosition(lua_State* state)
{
    l_tools_checkUserDataPlusErrMsg(state, 1, "You must provide a body");
    l_tools_checkUserDataPlusErrMsg(state, 2, "You must provide a space");

    l_physics_Body* body = (l_physics_Body*)lua_touserdata(state, 1);
    l_physics_PhysicsData* space = (l_physics_PhysicsData*)lua_touserdata(state, 2);

    cpVect vec = cpvzero;
    vec.x = l_tools_toNumberOrError(state, 3);
    vec.y = l_tools_toNumberOrError(state, 4);

    cpBodySetPosition(body->body, vec);
    /*
     * Docs:
     * When changing the position you may also want to call cpSpaceReindexShapesForBody()
     * to update the collision detection information for the attached shapes if plan to
     * make any queries against the space.
     */
    cpSpaceReindexShapesForBody(space->physics->space, body->body);

    return 0;
}
Exemplo n.º 28
0
static int l_graphics_Mesh_getVertex(lua_State* state) {
  l_assertType(state, 1, l_graphics_isMesh);
  l_graphics_Mesh const* mesh = l_graphics_toMesh(state, 1);

  size_t index = l_tools_toNumberOrError(state, 2) - 1;

  graphics_Vertex const* vertex = graphics_Mesh_getVertex(&mesh->mesh, index);
  float const* vf = (float const*)vertex;

  for(size_t j = 0; j < 4; ++j) {
    lua_pushnumber(state, vf[j]);
  }
  for(size_t j = 4; j < 8; ++j) {
    lua_pushnumber(state, floor(vf[j] * 255.0f));
  }

  return 8;
}
Exemplo n.º 29
0
int l_graphics_newQuad(lua_State* state) {
  float x = l_tools_toNumberOrError(state, 1);
  float y = l_tools_toNumberOrError(state, 2);
  float w = l_tools_toNumberOrError(state, 3);
  float h = l_tools_toNumberOrError(state, 4);
  float rw = l_tools_toNumberOrError(state, 5);
  float rh = l_tools_toNumberOrError(state, 6);

  graphics_Quad* obj = lua_newuserdata(state, sizeof(graphics_Quad));

  graphics_Quad_newWithRef(obj, x, y, w, h, rw, rh);

  lua_rawgeti(state, LUA_REGISTRYINDEX, moduleData.quadMT);
  lua_setmetatable(state, -2);

  return 1;
}
Exemplo n.º 30
0
static void readVertex(lua_State* state, graphics_Vertex* out, bool *hasVertexColor) {
  if(!lua_istable(state, -1) || lua_objlen(state, -1) < 4) {
    lua_pushstring(state, "Table entry is not a vertex");
    lua_error(state); // does not return
    return;           // hint the compiler
  }

  _Static_assert(sizeof(graphics_Vertex) == 8*sizeof(float), "");
  float *t = (float*)out;

  for(int i = 0; i < 4; ++i) {
    lua_rawgeti(state, -1, i+1);
    t[i] = l_tools_toNumberOrError(state, -1);
    lua_pop(state, 1);
  }

  for(int i = 4; i < 8; ++i) {
    lua_rawgeti(state, -1, i+1);
    t[i] = luaL_optnumber(state, -1, 255.0f) / 255.0f;
    *hasVertexColor = (*hasVertexColor) || t[i] != 1.0f;
    lua_pop(state, 1);
  }
}