示例#1
0
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();
    }
}
示例#2
0
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;
}
示例#3
0
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));
    }
}