Exemple #1
0
// ---------------------------------------------------------------------------
eir_gfx_sprite_batch_t * eir_gfx_push_sprite_batch_to_group(
   eir_gfx_group_t * group,
   const eir_gfx_texture_t * texture,
   size_t sprite_count,
   bool editable,
   bool use_screen_coord,
   bool visible
   )
{
   eir_gfx_sprite_batch_t * batch = 0;

   if (group && sprite_count > 0)
   {
      EIR_KER_GET_ARRAY_NEXT_EMPTY_SLOT(group->sprite_batches, batch);
   }
   if (batch)
   {
      EIR_KER_ALLOC_SORTABLE_ARRAY(eir_gfx_sprite_t, batch->sprites, sprite_count, eir_gfx_init_sprite);
      batch->texture = texture;
      batch->info = eir_gfx_item_flag_default;
      if (editable)
      {
         batch->info |= eir_gfx_item_flag_editable;
      }
      if (visible)
      {
         batch->info |= eir_gfx_item_flag_visible;
      }
      if (use_screen_coord)
      {
         batch->info |= eir_gfx_item_flag_use_screen_coord;
      }
   }
   return batch;
}
Exemple #2
0
// ---------------------------------------------------------------------------
eir_gfx_image_t * eir_gfx_load_image(
   eir_gfx_env_t * env,
   const char * img_filename,
   bool must_invert_img
   )
{
   eir_gfx_image_t * image = 0;

   if (env)
   {
      EIR_KER_GET_ARRAY_NEXT_EMPTY_SLOT(env->images, image);
   }
   if (image)
   {
      bool result = eir_gfx_api_load_image(
         img_filename,
         must_invert_img,
         image
         );

      if (!result)
      {
         EIR_KER_LOG_ERROR("CANNOT LOAD IMAGE FROM FILE %s", img_filename);
         eir_gfx_release_image(image);
         image = 0;
      }
   }
   return image;
}
Exemple #3
0
eir_snd_sound_t * eir_snd_load_sound_file(eir_snd_env_t * snd_env, const char * filename)
{
    eir_snd_sound_t * sound = 0;

    if (snd_env)
    {
        EIR_KER_GET_ARRAY_NEXT_EMPTY_SLOT(snd_env->sounds, sound);
    }
    if (sound)
    {
        sound->chunk = eir_snd_api_create_chunk_from_file(filename);
    }
    return sound;
}
Exemple #4
0
// ---------------------------------------------------------------------------
eir_gfx_texture_t * eir_gfx_create_texture(
   eir_gfx_env_t * env,
   const eir_gfx_image_t * image
   )
{
   eir_gfx_texture_t * texture = 0;

   if (env && image)
   {
      EIR_KER_GET_ARRAY_NEXT_EMPTY_SLOT(env->textures, texture);
   }
   if (texture)
   {
      texture->id = eir_gfx_api_create_texture(image);
      texture->image = image;
      if (texture->id == EIR_GFX_INVALID_TEXTURE_HANDLE)
      {
         EIR_KER_LOG_ERROR("CANNOT CREATE TEXTURE FROM IMAGE");
         eir_gfx_release_texture(texture);
      }
   }
   return texture;
}
Exemple #5
0
// ---------------------------------------------------------------------------
eir_gfx_rect_batch_t * eir_gfx_push_rect_batch_to_group(
   eir_gfx_group_t * group,
   size_t rect_count,
   bool editable,
   bool use_screen_coord,
   bool visible
   )
{
   eir_gfx_rect_batch_t * batch = 0;

   if (group && rect_count > 0)
   {
      EIR_KER_GET_ARRAY_NEXT_EMPTY_SLOT(group->rect_batches, batch);
   }
   if (batch)
   {
      EIR_KER_ALLOC_SORTABLE_ARRAY(eir_gfx_rect_t, batch->rects, rect_count, eir_gfx_init_rect);
      batch->info = eir_gfx_item_flag_default;
      if (editable)
      {
         batch->info |= eir_gfx_item_flag_editable;
      }
      if (visible)
      {
         batch->info |= eir_gfx_item_flag_visible;
      }
      if (use_screen_coord)
      {
         batch->info |= eir_gfx_item_flag_use_screen_coord;
      }
   }
   else
   {
      EIR_KER_LOG_ERROR("CANNOT PUSH MORE RECT BATCH TO GROUP");
   }
   return batch;
}
Exemple #6
0
eir_gme_world_t * eir_gme_create_world(
   eir_gme_env_t * env,
   size_t max_entity_count
   )
{
   eir_gme_world_t * world = 0;

   if (env)
   {
      EIR_KER_GET_ARRAY_NEXT_EMPTY_SLOT(env->worlds, world);
   }
   if (world)
   {  
      EIR_KER_ALLOCATE_ARRAY_BIS(
         eir_gme_entity_flags_t,
         world->entities_flags,
         max_entity_count,
         eir_gme_init_entity_flags
         );
      EIR_KER_ALLOCATE_ARRAY_BIS(
         eir_gme_position_component_t,
         world->positions,
         max_entity_count,
         eir_gme_init_position
         );
      EIR_KER_ALLOCATE_ARRAY_BIS(
         eir_gme_size_component_t,
         world->sizes,
         max_entity_count,
         eir_gme_init_size
         );
      EIR_KER_ALLOCATE_ARRAY_BIS(
         eir_gme_sprite_component_t,
         world->sprites,
         max_entity_count,
         eir_gme_init_sprite
         );
      EIR_KER_ALLOCATE_ARRAY_BIS(
         eir_gme_color_component_t,
         world->colors,
         max_entity_count,
         eir_gme_init_color
         );
      EIR_KER_ALLOCATE_ARRAY_BIS(
         eir_gme_motion_param_component_t,
         world->motion_params,
         max_entity_count,
         eir_gme_init_motion_param
         );
      EIR_KER_ALLOCATE_ARRAY_BIS(
         eir_gme_aabb_component_t,
         world->aabbs,
         max_entity_count,
         eir_gme_init_aabb
         );
      EIR_KER_ALLOCATE_ARRAY_BIS(
         eir_gme_physic_component_t,
         world->physics,
         max_entity_count,
         eir_gme_init_physic
         );
      EIR_KER_ALLOCATE_ARRAY_BIS(
         eir_gme_direction_component_t,
         world->directions,
         max_entity_count,
         eir_gme_init_direction
         );
      EIR_KER_ALLOCATE_ARRAY_BIS(
         eir_gme_state_component_t,
         world->states,
         max_entity_count,
         eir_gme_init_state
         );
      EIR_KER_ALLOCATE_ARRAY_BIS(
         eir_gme_fsm_component_t,
         world->fsms,
         max_entity_count,
         eir_gme_init_fsm
         );
      EIR_KER_ALLOCATE_ARRAY_BIS(
         eir_gme_aabb_primitive_component_t,
         world->aabb_primitives,
         max_entity_count,
         eir_gme_init_aabb_primitive
         );
      EIR_KER_ALLOCATE_ARRAY_BIS(
         eir_gme_keyboard_component_t,
         world->keyboards,
         max_entity_count,
         eir_gme_init_keyboard
         );
      EIR_KER_ALLOCATE_ARRAY_BIS(
         eir_gme_pad_component_t,
         world->pads,
         max_entity_count,
         eir_gme_init_pad
         );
      EIR_KER_ALLOCATE_ARRAY_BIS(
         eir_gme_map_component_t,
         world->maps,
         max_entity_count,
         eir_gme_init_map
         );
      EIR_KER_ALLOCATE_ARRAY_BIS(
         eir_gme_map_layer_link_component_t,
         world->map_layer_links,
         max_entity_count,
         eir_gme_init_map_layer_link
         );
      alloc_colliding_map_tile_array_array(
         &world->colliding_map_tile_array_array,
         max_entity_count
         );
   }
   return world;
}
Exemple #7
0
void eir_gme_set_entity_map_tile(
   eir_gme_world_t * world,
   eir_gme_entity_t entity,
   int layer_index,
   int col_index,
   int row_index,
   eir_mth_vec2_t * uv_offset,
   eir_mth_vec2_t * uv_size,
   bool navigable
   )
{
   eir_gme_entity_flags_t * entity_flags = 0;
   eir_gme_map_component_t * map_component = 0;

   if (world)
   {
      EIR_KER_GET_ARRAY_ITEM(world->entities_flags, entity, entity_flags);
      EIR_KER_GET_ARRAY_ITEM(world->maps, entity, map_component);
   }

   eir_gme_map_layer_t * map_layer = 0;

   if (
      entity_flags
      && (*entity_flags) & eir_gme_component_type_map
      && map_component
      )
   {
      EIR_KER_GET_ARRAY_ITEM(map_component->layers, layer_index, map_layer);
   }

   eir_gme_map_tile_t * map_tile = 0;

   if (
      map_layer
      && col_index >= 0 && col_index < map_layer->col_count
      && row_index >= 0 && row_index < map_layer->row_count
      )
   {
      EIR_KER_GET_ARRAY_NEXT_EMPTY_SLOT(map_layer->tiles, map_tile);
      if (map_tile)
      {
         map_tile->col_index = col_index;
         map_tile->row_index = row_index;
         map_tile->navigable = navigable;
         
         eir_mth_vec2_t position;
         eir_mth_vec2_t size;
         eir_gfx_color_t color;
         
         position.x = map_layer->position.x + col_index * size.x;
         position.y = map_layer->position.y + row_index * size.y;
         size.x = map_layer->tile_width;
         size.y = map_layer->tile_height;
         color.r = 1.0f;
         color.g = 1.0f;
         color.b = 1.0f;
         color.a = 1.0f;

         map_tile->sprite_proxy = eir_gfx_add_sprite_to_batch(
            map_layer->batch,
            &position,
            &size,
            uv_offset,
            uv_size,
            &color,
            true
            );
      }
      else
      {
         EIR_KER_LOG_ERROR("NO MAP TILE AVAILABLE");
      }
   }
}
Exemple #8
0
void eir_gme_set_entity_map_layer(
   eir_gme_world_t * world,
   eir_gme_entity_t entity,
   eir_gfx_group_t * group,
   eir_gfx_sprite_batch_t * batch,
   const eir_mth_vec2_t * position,
   int col_count,
   int row_count,
   int tile_width,
   int tile_height,
   size_t tiles_capacity
   )
{
   eir_gme_entity_flags_t * entity_flags = 0;
   eir_gme_map_component_t * map_component = 0;

   if (world && batch && group)
   {
      EIR_KER_GET_ARRAY_ITEM(world->entities_flags, entity, entity_flags);
      EIR_KER_GET_ARRAY_ITEM(world->maps, entity, map_component);
   }
   if (
      entity_flags
      && (*entity_flags) & eir_gme_component_type_map
      && map_component
      )
   {
      eir_gme_map_layer_t * map_layer = 0;

      EIR_KER_GET_ARRAY_NEXT_EMPTY_SLOT(
         map_component->layers,
         map_layer
         );

      if (map_layer)
      {
         if (position)
         {
            map_layer->position.x = position->x;
            map_layer->position.y = position->y;
         }
         map_layer->col_count = col_count;
         map_layer->row_count = row_count;
         map_layer->tile_width = tile_width;
         map_layer->tile_height = tile_height;
         map_layer->group = group;
         map_layer->batch = batch;
         EIR_KER_ALLOCATE_ARRAY_BIS(
            eir_gme_map_tile_t,
            map_layer->tiles,
            tiles_capacity,
            eir_gme_init_map_tile
            );
      }
      else
      {
         EIR_KER_LOG_ERROR("NO AVAILABLE MAP LAYER");
      }
   }
   else
   {
      EIR_KER_LOG_ERROR("cannot find entity %d or component in array", entity);
   }
}
Exemple #9
0
// ---------------------------------------------------------------------------
eir_gfx_text_t * eir_gfx_push_text_to_group(
   eir_gfx_group_t * group,
   const char * text,
   size_t max_text_length,
   const eir_mth_vec2_t * position,
   float font_size,
   const eir_gfx_color_t * color,
   bool editable,
   bool use_screen_coord,
   bool visible
   )
{
   eir_gfx_text_t * gfx_text = 0;

   if (group && text && position && color)
   {
      EIR_KER_GET_ARRAY_NEXT_EMPTY_SLOT(group->texts, gfx_text)
   }
   if (gfx_text)
   {
      const float MAX_TEXTURE_WIDTH = 320;
      const float MAX_TEXTURE_HEIGHT = 320;
      const float MAX_TEXTURE_COL = 16;
      const float MAX_TEXTURE_ROW = 16;
      int text_len = strlen(text);

      EIR_KER_ALLOC_SORTABLE_ARRAY(eir_gfx_sprite_t, gfx_text->sprites, max_text_length, eir_gfx_init_sprite);

      eir_mth_vec2_t uv_offset;
      eir_mth_vec2_t uv_size;
      eir_mth_vec2_t size;
      char c;
      float x_offset;
      float y_offset;

      size.x = 0.9f < font_size ?
         font_size : (MAX_TEXTURE_WIDTH / MAX_TEXTURE_COL) / 4.0f;
      size.y = 0.9f < font_size ?
         font_size : (MAX_TEXTURE_HEIGHT / MAX_TEXTURE_ROW) / 4.0f;
      for (int index = 0; index < text_len; ++index)
      {
         float x = position->x + size.x * index;
         float y = position->y;

         uv_size.x = MAX_TEXTURE_WIDTH / MAX_TEXTURE_COL;
         uv_size.y = MAX_TEXTURE_HEIGHT / MAX_TEXTURE_ROW;
         c = text[index];
         x_offset = (int)c % (int)MAX_TEXTURE_COL;
         y_offset = (int)c / (int)MAX_TEXTURE_ROW;  
         uv_offset.x = x_offset * (MAX_TEXTURE_WIDTH / MAX_TEXTURE_COL);
         uv_offset.y = y_offset * (MAX_TEXTURE_HEIGHT / MAX_TEXTURE_ROW);

         eir_gfx_sprite_t * sprite = 0;
         eir_gfx_sprite_handle_t * sprite_handle = 0;

         EIR_KER_RESERVE_SORTABLE_ARRAY_NEXT_EMPTY_SLOT(
            gfx_text->sprites,
            sprite_handle,
            eir_gfx_swap_sprite
            );
         if (sprite_handle && sprite_handle->ptr)
         {
            sprite = sprite_handle->ptr;
            sprite->position.x = x;
            sprite->position.y = y;
            sprite->size.x = size.x;
            sprite->size.y = size.y;
            sprite->uv_offset.x = uv_offset.x;
            sprite->uv_offset.y = uv_offset.y;
            sprite->uv_size.x = uv_size.x;
            sprite->uv_size.y = uv_size.y;
            sprite->color.r = color->r;
            sprite->color.g = color->g;
            sprite->color.b = color->b;
            sprite->color.a = color->a;
            sprite->batch = gfx_text;
         }
      }
      gfx_text->info |= eir_gfx_item_flag_modified;
      if (editable)
      {
         gfx_text->info |= eir_gfx_item_flag_editable;
      }
      if (visible)
      {
         gfx_text->info |= eir_gfx_item_flag_visible;
      }
      if (use_screen_coord)
      {
         gfx_text->info |= eir_gfx_item_flag_use_screen_coord;
      }
   }
   return gfx_text;
}