Example #1
0
void DefaultObjects::init()
{
	RenderState *state;
	Geometry *axis[3];
	vec3f red, green, blue;

	red = vec3f(1.0f, 0.0f, 0.0f);
	green = vec3f(0.0f, 1.0f, 0.0f);
	blue = vec3f(0.0f, 0.0f, 1.0f);

	static const f32 vertex[4 * 3] = {
		-1.0f, 0.0f, -1.0f,
		1.0f, 0.0f, -1.0f,
		0.0f, 0.0f, 1.0f,
		0.0f, 1.0f, 0.0f
	};

	static const i32 index[4 * 3] = {
		0, 1, 2,
		1, 2, 3,
		0, 1, 3,
		2, 0, 3
	};

	failureShaderProgram = 0;
	failureTexture = 0;
	failureCubeMap = 0;
	failureVertexArray = 0;

	printf("    Setting up failure shader program\n");
	failureShaderProgram = SceneGraph::createShaderProgram("FailureShaderProgram", "Default", 0);
	if (!failureShaderProgram)
		REPORT_ERROR("Couldn't load default shader program");

	printf("    Setting up failure texture\n");
	failureTexture = SceneGraph::createTexture("FailureTexture", "textures/notex.png", true, TEXTURE_FILTER_TRILINEAR, TEXTURE_WRAP_REPEAT);
	if (!failureTexture)
		REPORT_ERROR("Couldn't load default texture");

	printf("    Setting up failure cube map\n");
	failureCubeMap = SceneGraph::createCubeMap("FailureCubeMap", "textures/notex.png", "textures/notex.png", "textures/notex.png", "textures/notex.png", "textures/notex.png", "textures/notex.png");
	if (!failureCubeMap)
		REPORT_ERROR("Couldn't load default cube map");

	printf("    Setting up failure vertex array\n");
	failureVertexArray = SceneGraph::createVertexArray("FailureVertexArray", (void *) vertex, 4 * 3, 4, TRIANGLES, USAGE_STATIC);
	printf("      Attribute\n");
	failureVertexArray->setAttribute("Vertex", 0, 3, ATTRIB_FLOAT32, false);
	printf("      Index array\n");
	failureVertexArray->setIndexArray((void *) index, 4, 12);

	printf("    Setting up bulb mesh\n");
	bulbMesh = SceneGraph::createGeometry("LightBulb", "scenes/light.obj", false);
	bulbShader = SceneGraph::createShaderProgram("LightShader", "Light", 0);
	bulbMesh->setShaderProgram(bulbShader, false);

	printf("    Setting up camera mesh\n");
	camMesh = SceneGraph::createGeometry("CameraModel", "scenes/camera.obj", false);
	camShader = SceneGraph::createShaderProgram("CameraShader", "Camera", 0);
	camMesh->setShaderProgram(camShader, false);

	printf("    Setting up arrow mesh\n");
	arrowMesh = SceneGraph::createGeometry("ArrowModel", "scenes/arrow.obj", false);
	arrowShader = SceneGraph::createShaderProgram("ArrowShader", "Axis", 0);
	arrowMesh->setShaderProgram(arrowShader, false);

	state = arrowShader->getRenderState();

	axis[0] = (Geometry *) arrowMesh->duplicate("AxisX", false);
	axis[1] = (Geometry *) arrowMesh->duplicate("AxisY", false);
	axis[2] = (Geometry *) arrowMesh->duplicate("AxisZ", false);

	axis[0]->scale(2.0f, 2.0f, 2.0f);
	axis[1]->scale(2.0f, 2.0f, 2.0f);
	axis[2]->scale(2.0f, 2.0f, 2.0f);

	axis[0]->setRotate(-fPI * 0.5f, 0.0f, 0.0f, 1.0f);
	axis[2]->setRotate(fPI * 0.5f, 1.0f, 0.0f, 0.0f);

	axis[0]->setVector("col", red.vec, 3, UNIFORM_FLOAT32);
	axis[1]->setVector("col", green.vec, 3, UNIFORM_FLOAT32);
	axis[2]->setVector("col", blue.vec, 3, UNIFORM_FLOAT32);

	axisGroup = SceneGraph::createGroup("AxisGroup");
	axisGroup->attachChild(axis[0]);
	axisGroup->attachChild(axis[1]);
	axisGroup->attachChild(axis[2]);

	printf("    Setting up grid\n");
	/* Grid */
	{
		u32 i, o;
		VertexArray *gridva;
		f32 gridv[2 * 21 * 2 * 2];
		vec3f color;

		color = vec3f(0.4f, 0.7f, 0.8f);

		for (i = 0; i < 21; i++) {
			gridv[i * 4] = ((f32) i) - 10.0f;
			gridv[i * 4 + 1] = -10.0f;
			gridv[i * 4 + 2] = ((f32) i) - 10.0f;
			gridv[i * 4 + 3] = 10.0f;
		}

		o = 21 * 4;

		for (i = 0; i < 21; i++) {
			gridv[o + i * 4] = -10.0f;
			gridv[o + i * 4 + 1] = ((f32) i) - 10.0f;
			gridv[o + i * 4 + 2] = 10.0f;
			gridv[o + i * 4 + 3] = ((f32) i) - 10.0f;
		}

		gridva = SceneGraph::createVertexArray("Grid", gridv, 2 * 4, 84, LINES, USAGE_STATIC);
		gridva->setAttribute("Vertex", 0, 2, ATTRIB_FLOAT32, false);
		gridva->setPurgeLevel(0);

		gridShader = SceneGraph::createShaderProgram("GridShader", "Grid", 0);
		gridShader->setPurgeLevel(0);

		state = gridShader->getRenderState();

		gridMesh = SceneGraph::createGeometry("GridMesh", gridva, false);
		gridMesh->setShaderProgram(gridShader, false);

		gridShader->setVector("Color", color.vec, 3, UNIFORM_FLOAT32);
		gridShader->renderState.disableCulling();

	}

	printf("    Default object setup complete\n");
}
Example #2
0
void run(SDL_Window* window){
    const glm::vec2 square[4]={
        glm::vec2( 1.0,  1.0),
        glm::vec2( 1.0, -1.0),
        glm::vec2(-1.0,  1.0),
        glm::vec2(-1.0, -1.0)
    };
    
    VertexArray vao;
    ArrayBuffer buf(BufferUsage::StaticDraw, 4, square);
    vao.setAttribute(0, buf).bind();

    ShaderProgram program, invertProgram;
    VertexShader vs, invertVs;
    FragmentShader fs, invertFs;
    Texture tex, tex_normal, rtt;
    
    FrameBuffer fbo(512, 512);

    try{
        vs.load(loadFile("shaders/test_normalmapping.vert"));
        fs.load(loadFile("shaders/test_normalmapping.frag"));
        program.attach(vs).attach(fs).link().bindAttrib(0, "in_Position").use();

        invertVs.load(loadFile("shaders/test_framebuffer.vert"));
        invertFs.load(loadFile("shaders/test_framebuffer.frag"));
        invertProgram.attach(invertVs).attach(invertFs).link().bindAttrib(0, "in_Position").use();

        tex.quickFileLoad("data/floor2c.bmp");
        tex_normal.quickFileLoad("data/floor2c_nm.bmp");
        rtt.emptyData(512, 512);

        fbo.attachColor(0, rtt);
        
        fbo.checkStatus();
    }catch(string error){
        cout << error << "\n" << endl;
    }catch(char const* error){
        cout << error << "\n" << endl;        
    }

    for(int i=0; i<60; i++){
        glClearColor(0.0, 0.0, 0.0, 1.0);
        glClear(GL_COLOR_BUFFER_BIT);

        glm::vec3 lightpos(0.0, 1.0 - i/30.0, 0.3);
        program.use()
               .uni("tex", tex)
               .uni("tex_normal", tex_normal)
               .uni("light", lightpos);

        fbo.bind();
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
        
        invertProgram.use()
                     .uni("rtt", rtt);
        
        FrameBuffer::bindScreen();
        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

        SDL_GL_SwapWindow(window);
        SDL_Delay(60);
    }
}