/* External functions */ Game* create_game(void) { int ii; Game* G = (Game*)calloc(1, sizeof(Game)); G->timer = create_timer(); G->graphics = create_graphics(); G->ui = create_ui(G->graphics); /* Set up camera */ G->camera = transform_zero; G->camera.orientation = quat_from_euler(0, -0.75f * kPi, 0); G->camera.position.x = 4.0f; G->camera.position.y = 2; G->camera.position.z = 7.5f; /* Load scene */ reset_timer(G->timer); G->scene = create_scene("lightHouse.obj"); G->sun_light.position = vec3_create(-4.0f, 5.0f, 2.0f); G->sun_light.color = vec3_create(1, 1, 1); G->sun_light.size = 35.0f; G->lights[0].color = vec3_create(1, 0, 0); G->lights[1].color = vec3_create(1, 1, 0); G->lights[2].color = vec3_create(0, 1, 0); G->lights[3].color = vec3_create(1, 0, 1); G->lights[4].color = vec3_create(0, 0, 1); G->lights[5].color = vec3_create(0, 1, 1); for(ii=0;ii<NUM_LIGHTS;++ii) { float x = (20.0f/NUM_LIGHTS) * ii - 8.0f; G->lights[ii].color = vec3_create(_rand_float(), _rand_float(), _rand_float()); G->lights[ii].color = vec3_normalize(G->lights[ii].color); if(ii % 2) G->lights[ii].position = vec3_create(x, _rand_float()*3 + 2.0f, 0.0f); else G->lights[ii].position = vec3_create(0.0f, _rand_float()*3 + 2.0f, x); G->lights[ii].size = 5; } get_model(G->scene, 3)->material->specular_color = vec3_create(0.5f, 0.5f, 0.5f); get_model(G->scene, 3)->material->specular_coefficient = 1.0f; G->dynamic_lights = 1; reset_timer(G->timer); return G; }
void Game::initialize(void) { timer_init(&_timer); _frame_count = 0; _render = Render::create(); _render->initialize(app_get_window()); _world.add_system(new RenderSystem, kRenderComponent); _world.add_system(new LightSystem, kLightComponent); RenderData::_render = _render; LightData::_render = _render; //srand((uint32_t)_timer.start_time); srand(42); // Texture loaders _resource_manager.add_handlers("jpg", Render::load_texture, Render::unload_texture, _render); _resource_manager.add_handlers("dds", Render::load_texture, Render::unload_texture, _render); _resource_manager.add_handlers("png", Render::load_texture, Render::unload_texture, _render); _resource_manager.add_handlers("tga", Render::load_texture, Render::unload_texture, _render); // File loaders _resource_manager.add_handlers("mesh", Render::load_mesh, Render::unload_mesh, _render); _resource_manager.add_handlers("obj", Render::load_mesh, Render::unload_mesh, _render); // Create some materials Material grass_material = { _resource_manager.get_resource("assets/grass.dds"), _resource_manager.get_resource("assets/grass_nrm.png"), {0}, {0.0f, 0.0f, 0.0f}, 0.0f, 0.0f }; Material materials[3] = { { _resource_manager.get_resource("assets/metal.dds"), _resource_manager.get_resource("assets/metal_nrm.png"), _resource_manager.get_resource("assets/metal.dds"), {0.0f, 0.0f, 0.0f}, 200.0f, 0.8f }, { _resource_manager.get_resource("assets/brick.dds"), _resource_manager.get_resource("assets/brick_nrm.png"), 0, {1.0f, 1.0f, 1.0f}, 4.0f, 0.1f }, { _resource_manager.get_resource("assets/wood.dds"), _resource_manager.get_resource("assets/wood_nrm.png"), 0, {1.0f, 1.0f, 1.0f}, 8.0f, 0.3f } }; // Ground const VtxPosNormTex ground_vertices[] = { /* Top */ { {-0.5f, 0.0f, -0.5f}, { 0.0f, 1.0f, 0.0f}, {0.0f, 10.0f} }, { { 0.5f, 0.0f, -0.5f}, { 0.0f, 1.0f, 0.0f}, {10.0f, 10.0f} }, { { 0.5f, 0.0f, 0.5f}, { 0.0f, 1.0f, 0.0f}, {10.0f, 0.0f} }, { {-0.5f, 0.0f, 0.5f}, { 0.0f, 1.0f, 0.0f}, {0.0f, 0.0f} }, /* Bottom */ { {-0.5f, 0.0f, -0.5f}, { 0.0f, -1.0f, 0.0f}, {0.0f, 10.0f} }, { { 0.5f, 0.0f, -0.5f}, { 0.0f, -1.0f, 0.0f}, {10.0f, 10.0f} }, { { 0.5f, 0.0f, 0.5f}, { 0.0f, -1.0f, 0.0f}, {10.0f, 0.0f} }, { {-0.5f, 0.0f, 0.5f}, { 0.0f, -1.0f, 0.0f}, {0.0f, 0.0f} }, }; const unsigned short ground_indices[] = { 3,1,0, 2,1,3, 3,0,1, 2,3,1, }; assert(ground_indices && ground_vertices); Transform transform = TransformZero(); transform.scale = 1.0f; transform.position.y = -100000.0f; transform.position.y = 0.0f; RenderData render_data = {0}; //render_data.mesh = _render->create_mesh(ARRAYSIZE(ground_vertices), kVtxPosNormTex, ARRAYSIZE(ground_indices), sizeof(ground_indices[0]), ground_vertices, ground_indices); //render_data.mesh = _render->sphere_mesh(); std::map<float3, VtxPosNormTex> m; std::vector<float3> verts; std::vector<VtxPosNormTex> terrain_verts; std::vector<uint32_t> terrain_indices; verts.reserve(1000000); terrain_verts.reserve(1000000); terrain_indices.reserve(1000000); const float size = 50.0f; float3 min = { -size, -size, -size }; float3 max = { size, size, size }; //min = float3addScalar(&min,) timer_reset(&_timer); generate_terrain_points(terrain_func, min, max, 1.0f, verts); debug_output("Time: %f\tNum raw Vertices: %d\n", timer_delta_time(&_timer), verts.size()); timer_reset(&_timer); smooth_terrain(verts, terrain_verts, terrain_indices); //generate_terrain(terrain_func, terrain_verts, terrain_indices); debug_output("time: %f, Num Terrain Vertices: %d\n", timer_delta_time(&_timer), terrain_verts.size()); debug_output("Num Terrain indices: %d\n", terrain_indices.size()); timer_reset(&_timer); render_data.mesh = _render->create_mesh((uint32_t)terrain_verts.size(), kVtxPosNormTex, (uint32_t)terrain_indices.size(), sizeof(uint32_t), terrain_verts.data(), terrain_indices.data()); render_data.material = grass_material; EntityID id = _world.create_entity(); _world.entity(id)->set_transform(transform) ->add_component(RenderComponent(render_data)); id = _world.create_entity(); Material sky_material = { _resource_manager.get_resource("assets/sky.png"), _resource_manager.get_resource("assets/default_norm.png"), {0}, {0.0f, 0.0f, 0.0f}, 0.0f, 0.0f }; render_data.material = sky_material; render_data.mesh = _render->sphere_mesh(); transform = TransformZero(); transform.scale = -100.0f; transform.scale = 1000.0f; _world.entity(id)->set_transform(transform) ->add_component(RenderComponent(render_data)); for(int ii=0; ii<32;++ii) { transform = TransformZero(); transform.scale = _rand_float(0.5f, 5.0f); transform.position.x = _rand_float(-50.0f, 50.0f); transform.position.y = _rand_float(3.0f, 7.5f); transform.position.z = _rand_float(-50.0f, 50.0f); float3 axis = { _rand_float(-3.0f, 3.0f), _rand_float(-3.0f, 3.0f), _rand_float(-3.0f, 3.0f) }; transform.orientation = quaternionFromAxisAngle(&axis, _rand_float(0.0f, kPi)); switch(rand()%2) { case 0: render_data.mesh = _render->sphere_mesh(); break; case 1: render_data.mesh = _render->cube_mesh(); break; } int material = rand()%3; render_data.material = materials[material]; id = _world.create_entity(); _world.entity(id)->set_transform(transform) ->add_component(RenderComponent(render_data)); } Material house_material = { _resource_manager.get_resource("assets/house_diffuse.tga"), _resource_manager.get_resource("assets/house_normal.tga"), _resource_manager.get_resource("assets/house_spec.tga"), {0.0f, 0.0f, 0.0f}, 1.5f, 0.06f }; transform = TransformZero(); transform.scale = 0.015f; transform.orientation = quaternionFromEuler(0.0f, DegToRad(-90.0f), 0.0f); render_data.mesh = _resource_manager.get_resource("assets/house_obj.obj"); render_data.material = house_material; id = _world.create_entity(); _world.entity(id)->set_transform(transform) ->add_component(RenderComponent(render_data)); // Add a "sun" Light light; light.pos.x = 0.0f; light.pos.y = 10.0f; light.pos.z = 0.0f; light.size = 250.0f; light.dir.x = 0.0f; light.dir.y = -1.0f; light.dir.z = 0.0f; light.color.x = 1.0f; light.color.y = 1.0f; light.color.z = 1.0f; light.inner_cos = 0.1f; light.type = kDirectionalLight; transform = TransformZero(); transform.orientation = quaternionFromEuler(DegToRad(90.0f), DegToRad(45.0f), 0.0f); transform.position = light.pos; _sun_id = _world.create_entity(); _world.entity(_sun_id)->set_transform(transform) ->add_component(LightComponent(light)); transform = TransformZero(); for(int ii=1;ii<MAX_LIGHTS;++ii) { light.pos.x = _rand_float(-50.0f, 50.0f); light.pos.y = _rand_float(1.0f, 4.0f); light.pos.z = _rand_float(-50.0f, 50.0f); light.size = 3.0f; light.color.x = _rand_float(0.0f, 1.0f); light.color.y = _rand_float(0.0f, 1.0f); light.color.z = _rand_float(0.0f, 1.0f); light.type = kPointLight; transform.position = light.pos; id = _world.create_entity(); _world.entity(id)->set_transform(transform) ->add_component(LightComponent(light)); } }