int main() { ResourceManager resourceManager = ResourceManager(); resourceManager.addResourceDirectory("res/"); sf::RenderWindow window(sf::VideoMode(WINDOW_X, WINDOW_Y), "ECS Test"); EntityManager entityManager = EntityManager(&window, 100); for (int i = 1; i < 10000; ++i) { int temp = entityManager.createEntity(sf::Vector2f(WINDOW_X * float(rand()) / RAND_MAX, WINDOW_Y * float(rand()) / RAND_MAX)); entityManager.attachComponent(temp, RenderComponent(resourceManager.getTexture("player.png"))); entityManager.attachComponent(temp, PhysicsComponent(sf::Vector2f(100 * (float(rand()) / RAND_MAX - 0.5), 100 * (float(rand()) / RAND_MAX - 0.5)))); } // Remove some entities. for (int i = 1; i < 3; ++i) { entityManager.destroyEntity(i); } // Remove some components. for (int i = 3; i < 10; ++i) { entityManager.detachComponent(i, RENDER); } sf::Clock clock; while (window.isOpen()) { // Handle events. sf::Event event; while (window.pollEvent(event)) { if(event.type == sf::Event::Closed) { window.close(); } } float frametime = clock.restart().asSeconds(); std::cout << (1 / frametime) << std::endl; window.clear(sf::Color::White); entityManager.update(frametime); window.display(); } }
bool ae::es::Render::message( const ae::Message& message ) { assert( message.domain == ae::ms::domain::entity ); auto& data = message.data; if( message.usage == ae::ms::usage::remove && ( message.type == ae::ms::type::entity || message.type == ae::ms::type::render ) ) { m_components.erase( data[0].cptr_entity->id() ); return false; } if( message.type == ae::ms::type::entity && message.usage == ae::ms::usage::get ) { auto iter = m_components.find( data[0].cptr_entity->id() ); if( iter != m_components.end() ) { std::ostringstream oss; oss << "\trender: "; oss << iter->second.m_model.get_model_name(); data[1].ptr_vector_string->push_back( oss.str() ); return true; } return false; } if( message.type != ae::ms::type::render ) { return false; } if( message.usage == ae::ms::usage::add ) { m_components.emplace( data[0].ptr_entity->id(), RenderComponent( *( data[1].cptr_model ), *( data[2].cptr_shader) ) ); return true; } return false; }
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)); } }