Beispiel #1
0
std::unique_ptr<Renderable> ResourceManager::createRenderable(std::unique_ptr<Material>&& mat, Mesh* mesh){
    assert(mat != nullptr && mesh != nullptr);

    std::uint64_t shader_id = (std::uint64_t)mat->getShader()->getID();
    std::uint64_t mesh_id = (std::uint64_t)mesh->getID();

    std::uint64_t hash = (shader_id << 32) | mesh_id;

    if(existing_vaos_.find(hash) != existing_vaos_.end()){
        GLuint vao_name = existing_vaos_[hash];

        try{
            return std::unique_ptr<Renderable>(new Renderable(std::move(mat), mesh, vao_name));
        }
        catch(RenderableError e){
            std::cerr << e.what() << std::endl;

            return nullptr;
        }
    }

    try{
        std::unique_ptr<Renderable> renderable(new Renderable(std::move(mat), mesh));
        existing_vaos_[hash] = renderable->getVAOName();

        return renderable;
    }
    catch(RenderableError e){
        std::cerr << e.what() << std::endl;

        return nullptr;
    }


}
Beispiel #2
0
void SceneComponent::render(sf::RenderTarget& target, sf::RenderStates states)
{
	states.transform *= getTransform();
	if (renderable() && isVisible())
	{
		renderCurrent(target, states);
	}
	renderChildren(target, states);
}
Beispiel #3
0
void Scene::update(double dt, std::vector<CameraEvent> userInputs)
{
    glm::vec3 translation = glm::vec3(0 ,0 ,0);
    float pitch = 0;
    float yaw = 0;
    float roll = 0;
    float speedFactor = 1.0f;
    
    for (CameraEvent input : userInputs) {
        
        switch (input.type) {
            case translateX:
                translation += glm::vec3(input.value, 0, 0);
                break;
            case translateY:
                translation += glm::vec3(0, input.value, 0);
                break;
            case translateZ:
                translation += glm::vec3(0, 0, input.value);
                break;
            case rotateX:
                pitch += input.value;
                break;
            case rotateY:
                yaw += input.value;
                break;
            case rotateZ:
                roll += input.value;
                break;
            case sprint:
                speedFactor = input.value;
                break;
            default:
                break;
        }
    }
        
    pitch *= dt;
    yaw *= dt;
    roll *= dt;
    translation *= (dt * speedFactor);
    
    m_currentCamera->translate(translation);
    m_currentCamera->rotate(pitch, yaw, roll);
    
    // Process pending shapes
    while (!m_pendingShapes.empty()) {
        
        koi::RenderablePtr shape = m_pendingShapes.front();
        m_pendingShapes.pop();
        
        // Create new OpenGL shape renderable on OpenGL thread
        OpenGLShapePtr renderable( new OpenGLShape( shape ) );
        m_cachedEntities.push_back(renderable);
        m_renderEntities[ shape->getIdentifier() ] = renderable;
    }
}
IParticleNodePtr ParticlesManager::createParticleNode(const std::string& name)
{
	std::string nameCleaned = name;

	// Cut off the ".prt" from the end of the particle name
	if (boost::algorithm::ends_with(nameCleaned, ".prt"))
	{
		nameCleaned = nameCleaned.substr(0, nameCleaned.length() - 4);
	}

	ParticleDefMap::const_iterator found = _particleDefs.find(nameCleaned);

	if (found == _particleDefs.end())
	{
		return IParticleNodePtr();
	}

	RenderableParticlePtr renderable(new RenderableParticle(found->second));
	return ParticleNodePtr(new ParticleNode(renderable));
}
Beispiel #5
0
int main(int argc, char* argv[]) {

    printf("Creating OpenGL context...\n");
    sf::ContextSettings settings;
    settings.antialiasingLevel = 8;
    settings.majorVersion = 3;
    settings.minorVersion = 2;
    sf::RenderWindow window(sf::VideoMode(WINDOW_WIDTH, WINDOW_HEIGHT), "DSC Demo", sf::Style::Default, settings);

    printf("Initializing OpenGL...\n");
    glewExperimental = GL_TRUE;
    glewInit();

    printf("VENDOR = %s\n", glGetString(GL_VENDOR));
    printf("RENDERER = %s\n", glGetString(GL_RENDERER));
    printf("VERSION = %s\n", glGetString(GL_VERSION));

    GLuint vao;
    glGenVertexArrays(1, &vao);

    glDisable(GL_CULL_FACE);
    glDisable(GL_DEPTH_TEST);
    glEnable(GL_BLEND);
    glDepthFunc(GL_LESS);
    glBlendEquation(GL_FUNC_ADD);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    // Load/generate tet mesh based on command line argument:
    TetMesh * tet_mesh;
    printf("Generating tet mesh...\n");
    /*
     * 1: Sphere
     * 2: Debug tetmesh
     * 3: Big debug tetmesh
     * 4: Collapsed tetmesh
     * 5: Sphere, rotated
     * 6: C-mesh, joining together
     * 7: Sphere, stretched in the x-direction
     */
    std::string meshArg = "1";
    if (argc >= 2) { meshArg = argv[1]; }

    if (meshArg == "2") { // Debug tetmesh
        tet_mesh = TetMeshFactory::create_debug_tetmesh();
        printf("Evolving tet mesh ...\n");
        tet_mesh->evolve();
    } else if (meshArg == "3") { // Big debug tetmesh
        tet_mesh = TetMeshFactory::create_big_debug_tetmesh();
        printf("Evolving tet mesh ...\n");
        tet_mesh->evolve();
    } else if (meshArg == "4") { // Collapsed tetmesh
        tet_mesh = TetMeshFactory::create_collapsed_tetmesh();
        printf("Evolving tet mesh ...\n");
        tet_mesh->evolve();
    } else if (meshArg == "5") { // Rotated sphere tetmesh
        IndexedFaceSet * mesh = IndexedFaceSet::load_from_obj("assets/models/sphere.obj");
        tet_mesh = TetMeshFactory::from_indexed_face_set(*mesh);
        delete mesh;


        for (int deg = 1; deg <= 57; deg++) {
            REAL angle = PI / 180;
            for (unsigned int i = 0; i < tet_mesh->vertices.size() / 3; i++) {
                if (tet_mesh->get_vertex_status(i) == INTERFACE) {
                    glm::detail::tvec4<REAL, glm::precision::defaultp> v(tet_mesh->vertices[i*3], tet_mesh->vertices[i*3+1], tet_mesh->vertices[i*3+2], 1);
                    glm::detail::tvec4<REAL, glm::precision::defaultp> v2 = glm::rotateX(v, angle);
                    tet_mesh->vertex_targets[i*3] = v2[0];
                    tet_mesh->vertex_targets[i*3+1] = v2[1];
                    tet_mesh->vertex_targets[i*3+2] = v2[2];
                    tet_mesh->vertex_statuses[i] = MOVING;
                }
            }
            printf("Evolving tet mesh (%d deg)...\n", deg);
            tet_mesh->evolve();
        }
    } else if (meshArg == "6") { // C-mesh
        IndexedFaceSet * mesh = IndexedFaceSet::load_from_obj("assets/models/c_mesh.obj");
        tet_mesh = TetMeshFactory::from_indexed_face_set(*mesh);
        delete mesh;

        for (unsigned int i = 0; i < tet_mesh->vertices.size() / 3; i++) {
			if (tet_mesh->get_vertex_status(i) == INTERFACE) 
			{
		        glm::detail::tvec4<REAL, glm::precision::defaultp> v(tet_mesh->vertices[i*3], tet_mesh->vertices[i*3+1], tet_mesh->vertices[i*3+2], 1);
                if (tet_mesh->vertices[i*3] == 0.64f && tet_mesh->vertices[i*3+1] == 0.10f)
				{
					tet_mesh->vertex_targets[i*3] = tet_mesh->vertices[i*3];		// Stays the same
					tet_mesh->vertex_targets[i*3+1] = -0.10f;	// Moves to create C Mesh case
					tet_mesh->vertex_targets[i*3+2] = tet_mesh->vertices[i*3+2];	// Stays the same
				}
				else
				{
					tet_mesh->vertex_targets[i*3] = tet_mesh->vertices[i*3];
					tet_mesh->vertex_targets[i*3+1] = tet_mesh->vertices[i*3+1];
					tet_mesh->vertex_targets[i*3+2] = tet_mesh->vertices[i*3+2];
				}
				tet_mesh->vertex_statuses[i] = MOVING;
            }
		}
        printf("Evolving tet mesh from C mesh...\n");
        tet_mesh->evolve();
		
    }  else if (meshArg == "7") { // Stretched sphere
        IndexedFaceSet * mesh = IndexedFaceSet::load_from_obj("assets/models/sphere.obj");
        tet_mesh = TetMeshFactory::from_indexed_face_set(*mesh);
        for (unsigned int i = 0; i < tet_mesh->vertices.size() / 3; i++) {
            if (tet_mesh->get_vertex_status(i) == INTERFACE) {
                // scale x
                tet_mesh->vertex_targets[i * 3] = tet_mesh->vertices[i * 3] * 1.2;
                tet_mesh->vertex_targets[i * 3 + 1] = tet_mesh->vertices[i * 3 + 1];
                tet_mesh->vertex_targets[i * 3 + 2] = tet_mesh->vertices[i * 3 + 2];
                tet_mesh->vertex_statuses[i] = MOVING;
            }
        }
        printf("Evolving tet mesh ...\n");
        tet_mesh->evolve();
    } else { // Default case (tet mesh #1)
        IndexedFaceSet * mesh = IndexedFaceSet::load_from_obj("assets/models/sphere.obj");
        tet_mesh = TetMeshFactory::from_indexed_face_set(*mesh);
        printf("Evolving tet mesh ...\n");
        tet_mesh->evolve();
        delete mesh;
    }

    printf("Displaying tet mesh...\n");

    printf("Initializing display...\n");
    Shader * shader = Shader::compile_from("shaders/dsc.vsh", "shaders/dsc.gsh", "shaders/dsc.fsh");
    glUseProgram(shader->get_id());
    glBindVertexArray(vao);
    Renderable renderable(shader, true, false, GL_TRIANGLES);

    tgui::Gui gui(window);
    gui.setGlobalFont("assets/fonts/DejaVuSans.ttf");
    TetrahedralViewer viewer(&renderable, &gui);
    viewer.init(WINDOW_WIDTH, WINDOW_HEIGHT, FOV);
    viewer.bind_attributes(*tet_mesh, renderable);
    check_gl_error();
    delete tet_mesh;

    printf("Starting display...\n");
    sf::Event event;
    sf::Clock clock;
    tgui::Callback callback;
    while (window.isOpen()) {
        // float frame_length = clock.restart().asSeconds();

        glUseProgram(shader->get_id());
        glBindVertexArray(vao);
        while (gui.pollCallback(callback)) {
            viewer.handle_callback(callback);
        }

        viewer.update();
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        renderable.render();
        check_gl_error();

        glUseProgram(0);
        glBindVertexArray(0);
        gui.draw();
        window.display();

        while (window.pollEvent(event)) {
            if (event.type == sf::Event::Closed) {
                printf("Closing window...\n");
                window.close();
            }
            viewer.handle_event(event);
        }

        sf::sleep(sf::seconds(1.0f / FRAME_RATE));
    }

    printf("Cleaning up...\n");
    delete shader;

    return 0;
}