예제 #1
0
int WINAPI WinMain(
	HINSTANCE /* hInstance */,
	HINSTANCE /* hPrevInstance */,
	LPSTR /* lpCmdLine */,
	int /* nCmdShow */
	)
{
	// Use HeapSetInformation to specify that the process should
	// terminate if the heap manager detects an error in any heap used
	// by the process.
	// The return value is ignored, because we want to continue running in the
	// unlikely event that HeapSetInformation fails.
	HeapSetInformation(NULL, HeapEnableTerminationOnCorruption, NULL, 0);

	if (SUCCEEDED(CoInitialize(NULL)))
	{
		{
			BaseApp app;

			if (SUCCEEDED(app.Initialize()))
			{
				app.RunMessageLoop();
			}
		}
		CoUninitialize();
	}

	return 0;
}
예제 #2
0
int main() {
	
	BaseApp* app = new UtilitySystemApp();
	if (app->Startup())
		app->Run();
	app->Shutdown();

	return 0;
}
예제 #3
0
파일: main.cpp 프로젝트: dormon/FitGL
int main(int /*argc*/, char ** /*argv*/) {
  BaseApp app;
  ProgramObject program;

  auto mainWindow = app.getMainWindow();

  std::string prefix = app.getResourceDir() + "Shaders/Examples/e06_ModelLoader/";

  PerspectiveCamera cam;
  OrbitManipulator manipulator(&cam);
  manipulator.setupCallbacks(app);
  NodeShared root;

  GLuint query[2];

  
  app.addInitCallback([&]() {
    auto vs = compileShader(GL_VERTEX_SHADER, Loader::text(prefix + "phong.vert"));
    auto fs = compileShader(GL_FRAGMENT_SHADER, Loader::text(prefix + "phong.frag"));
    program = createProgram(vs, fs);

    root = Loader::scene(app.getResourceDir() + "Models/sponza/sponza.fbx");
    glCreateQueries(GL_TIMESTAMP, 2, query);
    SDL_GL_SetSwapInterval(0);
  });

  app.addResizeCallback([&](int w, int h) {
    glViewport(0, 0, w, h);
    cam.setAspect(float(w) / float(h));
  });

  app.addDrawCallback([&]() {


    glQueryCounter(query[0], GL_TIMESTAMP);
    glClearColor(0.2, 0.2, 0.2, 1);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);
    //bunny

    program.use();
    program.setMatrix4fv("p", value_ptr(cam.getProjection()));
    program.setMatrix4fv("v", value_ptr(cam.getView()));

    drawNode(program, root);
    glQueryCounter(query[1], GL_TIMESTAMP);

    GLuint64 time1, time2;
    glGetQueryObjectui64v(query[0], GL_QUERY_RESULT, &time1);
    glGetQueryObjectui64v(query[1], GL_QUERY_RESULT, &time2);

    std::string s = "fps: " + std::to_string(1e9 / (time2 - time1)) + " (" + std::to_string(ImGui::GetIO().Framerate) + ")";
    label(s, 0, 0, 300, 100);
  });
  return app.run();
}
예제 #4
0
파일: textures.cpp 프로젝트: dormon/FitGL
int main(int /*argc*/, char ** /*argv*/) {
	BaseApp app;
	GLuint program;
	GLuint vao;
	GLuint vbo;
	GLuint ebo;

	mat4 p;
	int z = 4;
	auto mainWindow = app.getMainWindow();

	std::string prefix = app.getResourceDir() + "Shaders/Examples/e04_Textures/";
	std::string texPrefix = app.getResourceDir() + "Textures/PGP2015/";

	GLuint texture[9];

	app.addInitCallback([&]() {
		auto vs = compileShader(GL_VERTEX_SHADER, Loader::text(prefix + "empty.vert"));
		auto gs = compileShader(GL_GEOMETRY_SHADER, Loader::text(prefix + "quad.geo"));
		auto fs = compileShader(GL_FRAGMENT_SHADER, Loader::text(prefix + "texture.frag"));
		program = createProgram(vs, gs, fs);

		glCreateVertexArrays(1, &vao);
		glBindVertexArray(vao);
		texture[0] = Loader::texture(texPrefix + "up.bmp");
		texture[1] = Loader::texture(texPrefix + "down.bmp");
		texture[2] = Loader::texture(texPrefix + "front.bmp");
		texture[3] = Loader::texture(texPrefix + "back.bmp");
		texture[4] = Loader::texture(texPrefix + "left.bmp");
		texture[5] = Loader::texture(texPrefix + "right.bmp");
		texture[6] = Loader::texture(texPrefix + "du2.bmp");
		texture[7] = Loader::texture(texPrefix + "du05a.bmp");
		texture[8] = Loader::texture(texPrefix + "du05b.bmp");

	});

	app.addDrawCallback([&]() {
		int w = mainWindow->getWidth();
		int h = mainWindow->getHeight();
		glViewport(0, 0, w, h); 
		glClearColor(0.2, 0.2, 0.2, 1);
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
		glEnable(GL_DEPTH_TEST);
		glUseProgram(program);

		for (int y = 0; y < 3; y++){
			for (int x = 0; x < 3; x++) {
				glUniform2f(glGetUniformLocation(program, "posMin"), -1 + x*(2.0 / 3), -1 + y*(2.0 / 3));
				glUniform2f(glGetUniformLocation(program, "posMax"), -1 + (x + 1)*(2.0 / 3), -1 + (y + 1)*(2.0 / 3));
				glBindTextureUnit(0, texture[y * 3 + x]);
				glDrawArrays(GL_POINTS, 0, 1);
			}
		}

	});
	return app.run();
}
예제 #5
0
int main(int /*argc*/, char* /*argv*/[])
{
	try
	{
		BaseApp app;
		app.init();
		app.run();
		app.shutdown();
	}
	catch (std::exception& err)
	{
		std::cout << "Error: " << err.what() << std::endl;

		throw;
	}
	catch (...)
	{
		std::cout << "Unknown Error: " << std::endl;
		throw;
	}

	return EXIT_SUCCESS;
}
예제 #6
0
LRESULT CALLBACK BaseApp::WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
	LRESULT result = 0;

	if (message == WM_CREATE)
	{
		LPCREATESTRUCT pcs = (LPCREATESTRUCT)lParam;
		BaseApp *pBaseApp = (BaseApp *)pcs->lpCreateParams;

		::SetWindowLongPtrW(
			hwnd,
			GWLP_USERDATA,
			PtrToUlong(pBaseApp)
			);

		result = 1;
	}
	else
	{
		BaseApp *pBaseApp = reinterpret_cast<BaseApp *>(static_cast<LONG_PTR>(
			::GetWindowLongPtrW(
			hwnd,
			GWLP_USERDATA
			)));

		bool wasHandled = false;
		UINT width = LOWORD(lParam);
		UINT height = HIWORD(lParam);
		if (pBaseApp)
		{
			switch (message)
			{
			case WM_KEYDOWN:
				pBaseApp->OnKeyDown(wParam);
				InvalidateRect(hwnd, NULL, FALSE);
				break;
			case WM_SIZE:
				pBaseApp->OnResize(width, height);
				result = 0;
				wasHandled = true;
				break;
			case WM_DISPLAYCHANGE:
				InvalidateRect(hwnd, NULL, FALSE);
				result = 0;
				wasHandled = true;
				break;
			case WM_PAINT:
				pBaseApp->OnRender();
				ValidateRect(hwnd, NULL);
				result = 0;
				wasHandled = true;
				break;
			case WM_DESTROY:
				PostQuitMessage(0);
				result = 1;
				wasHandled = true;
				break;
			}
		}

		if (!wasHandled)
		{
			result = DefWindowProc(hwnd, message, wParam, lParam);
		}
	}

	return result;
}
예제 #7
0
int main(int /*argc*/, char ** /*argv*/) {
	BaseApp app;	
	GLuint program;
	GLuint vao;
	GLuint vbo;
	GLuint ebo;

	mat4 p;
	int z = 4;
	auto window0 = app.getMainWindow();
	window0->setSize(200, 200);
	window0->move(100, 100);
	auto window1 = app.addWindow(200, 200);
	window1->move(100, 300);
	auto window2 = app.addWindow(200, 200);
	window2->move(300, 100);
	auto window3 = app.addWindow(200, 200);
	window3->move(300, 300);

	std::string prefix = app.getResourceDir() + "Shaders/Examples/e03_MultipleWindows/";

	app.addInitCallback([&]() {
		auto vs = compileShader(GL_VERTEX_SHADER, Loader::text(prefix+"lambert.vert"));
		auto fs = compileShader(GL_FRAGMENT_SHADER, Loader::text(prefix + "lambert.frag"));
		program = createProgram(vs, fs);	

		bunnyInit(vao, vbo, ebo);
	});

	app.addDrawCallback([&]() {
		glClearColor(0.2, 0.2, 0.2, 1);
		glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
		glEnable(GL_DEPTH_TEST);
		glUseProgram(program);	

		int w = window0->getWidth();
		int h = window0->getHeight();
		glViewport(0, 0, w, h);
		p = perspective(radians(45.0f),float(w)/float(h), 0.1f, 1000.0f);
		glUniformMatrix4fv(glGetUniformLocation(program, "p"), 1, 0, value_ptr(p));
		int z = 4;
		mat4 v = lookAt(vec3(z,z,z), vec3(0, 0, 0), vec3(0, 1, 0));
		glUniformMatrix4fv(glGetUniformLocation(program, "v"), 1, 0, value_ptr(v));

		glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);		
		
		bunnyDraw();
		glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
	});

	app.addDrawCallback([&]() {
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
		int w = window1->getWidth();
		int h = window1->getHeight();
		glViewport(0, 0, w, h);
		mat4 v = lookAt(vec3(z, 0, 0), vec3(0, 0, 0), vec3(0, 1, 0));
		glUniformMatrix4fv(glGetUniformLocation(program, "v"), 1, 0, value_ptr(v));
		bunnyDraw();
	}, window1);
	
	app.addDrawCallback([&]() {
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
		int w = window2->getWidth();
		int h = window2->getHeight();
		glViewport(0, 0, w, h);
		mat4 v = lookAt(vec3(0, z, 0), vec3(0, 0, 0), vec3(1, 0, 0));
		glUniformMatrix4fv(glGetUniformLocation(program, "v"), 1, 0, value_ptr(v));
		bunnyDraw();
	}, window2);

	app.addDrawCallback([&]() {
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
		int w = window3->getWidth();
		int h = window3->getHeight();
		glViewport(0, 0, w, h);
		mat4 v = lookAt(vec3(0, 0, z), vec3(0, 0, 0), vec3(0, 1, 0));
		glUniformMatrix4fv(glGetUniformLocation(program, "v"), 1, 0, value_ptr(v));
		bunnyDraw();
	}, window3);
	return app.run();
}
예제 #8
0
파일: uv.cpp 프로젝트: dormon/FitGL
int main(int /*argc*/, char ** /*argv*/) {
	BaseApp app;
	ProgramObject programEnv, program;

	auto mainWindow = app.getMainWindow();

	PerspectiveCamera cam;
	OrbitManipulator manipulator(&cam);
	manipulator.setupCallbacks(app);
	manipulator.setZoom(3);
	
	GLuint diffuseTexture;
	GLuint specularTexture;

	GLuint vao;
	GLuint vaoEmpty;
	GLuint vbo;

	int32_t sphereSizeX = 20;
	int32_t sphereSizeY = 20;

	app.addInitCallback([&]() {
		std::string prefix = app.getResourceDir() + "Shaders/Tutorial/";
		auto vs = compileShader(GL_VERTEX_SHADER,
			"#version 450\n",
			Loader::text(prefix + "uv.vp"));
		auto fs = compileShader(GL_FRAGMENT_SHADER,
			"#version 450\n",
			Loader::text(prefix + "lighting.vp"),
			Loader::text(prefix + "uv.fp"));
		program = createProgram(vs, fs);
		
		std::string texPrefix = app.getResourceDir() + "Textures/Tutorial/";
		diffuseTexture = Loader::texture(texPrefix + "earth.png");
		specularTexture = Loader::texture(texPrefix + "earth_s.png");

		glCreateBuffers(1, &vbo);
		const uint32_t floatsPerVertex = 6;
		const uint32_t vertiesPerFace = 6;
		float*vertices = new float[sphereSizeX*sphereSizeY*vertiesPerFace*floatsPerVertex];
		for (int32_t y = 0; y<sphereSizeY; ++y) {
			for (int32_t x = 0; x<sphereSizeX; ++x) {
				for (uint32_t k = 0; k<vertiesPerFace; ++k) {
					const int32_t xOffset[] = { 0,1,0,0,1,1 };
					const int32_t yOffset[] = { 0,0,1,1,0,1 };
					float u = (float)(x + xOffset[k]) / sphereSizeX;
					float v = (float)(y + yOffset[k]) / sphereSizeY;
					float xAngle = -u*glm::two_pi<float>();
					float yAngle = v*glm::pi<float>();
					uint32_t faceId = y*sphereSizeX + x;
					uint32_t faceVertex = faceId*vertiesPerFace + k;
					vertices[faceVertex*floatsPerVertex + 0] = glm::cos(xAngle)*glm::sin(yAngle);
					vertices[faceVertex*floatsPerVertex + 1] = -glm::cos(yAngle);
					vertices[faceVertex*floatsPerVertex + 2] = glm::sin(xAngle)*glm::sin(yAngle);
					vertices[faceVertex*floatsPerVertex + 3] = 1;
					vertices[faceVertex*floatsPerVertex + 4] = u;
					vertices[faceVertex*floatsPerVertex + 5] = v;
				}
			}
		}
		glNamedBufferData(vbo, sizeof(float)*sphereSizeX*sphereSizeY*vertiesPerFace*floatsPerVertex, vertices, GL_STATIC_DRAW);
		delete[]vertices;

		glCreateVertexArrays(1, &vao);
		glEnableVertexArrayAttrib(vao, 0); 
		glVertexArrayAttribFormat(vao, 0, 4, GL_FLOAT, 0, 0); 
		glVertexArrayVertexBuffer(vao, 0, vbo, 0, sizeof(float)*floatsPerVertex);
		glEnableVertexArrayAttrib(vao, 1);
		glVertexArrayAttribFormat(vao, 1, 2, GL_FLOAT, 0, 0);
		glVertexArrayVertexBuffer(vao, 1, vbo, sizeof(float) * 4, sizeof(float)*floatsPerVertex);
		
		glClearColor(0, 0, 0, 1);
		glDisable(GL_CULL_FACE);
		glEnable(GL_DEPTH_TEST);
		glDepthFunc(GL_LEQUAL);
		glEnable(GL_TEXTURE_CUBE_MAP_SEAMLESS);
	});

	app.addResizeCallback([&](int w, int h) {
		glViewport(0, 0, w, h);
		cam.setAspect(float(w) / float(h));
	});

	app.addDrawCallback([&]() {
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
		program.use();
		glBindTextureUnit(0, diffuseTexture);
		glBindTextureUnit(1, specularTexture);

		program.setMatrix4fv("p", value_ptr(cam.getProjection()));
		program.setMatrix4fv("v", value_ptr(cam.getView()));

		glBindVertexArray(vao);
		glDrawArrays(GL_TRIANGLES, 0, sphereSizeX*sphereSizeY * 6);
		glBindVertexArray(0);
	});
	return app.run();
}
예제 #9
0
파일: main.cpp 프로젝트: dormon/FitGL
int main(int /*argc*/, char ** /*argv*/) {
  BaseApp app;
  ProgramObject programPlanet;
  ProgramObject programAtmosphere;
  ProgramObject programStars;


  auto mainWindow = app.getMainWindow();

  PerspectiveCamera cam;
  OrbitManipulator manipulator(&cam);
  manipulator.setupCallbacks(app);

  GLuint vao;
  GLuint vbo;

  bool wireframe = false;
  int starCount = 20000;
  int seed = 0;

  app.addInitCallback([&]() {
    string prefix = app.getResourceDir() + "shaders/Nei/n01_Planet/";
    auto vert = compileShader(GL_VERTEX_SHADER, Loader::text(prefix + "empty.vert"));
    auto tesc = compileShader(GL_TESS_CONTROL_SHADER, Loader::text(prefix + "planet.tesc"));
    auto tese = compileShader(GL_TESS_EVALUATION_SHADER, Loader::text(prefix + "planet.tese"));
    auto frag = compileShader(GL_FRAGMENT_SHADER, Loader::text(prefix + "planet.frag"));
    programPlanet = createProgram(vert, tesc, tese, frag);
    
    vert = compileShader(GL_VERTEX_SHADER, Loader::text(prefix + "empty.vert"));
    tesc = compileShader(GL_TESS_CONTROL_SHADER, Loader::text(prefix + "atmosphere.tesc"));
    tese = compileShader(GL_TESS_EVALUATION_SHADER, Loader::text(prefix + "atmosphere.tese"));
    frag = compileShader(GL_FRAGMENT_SHADER, Loader::text(prefix + "atmosphere.frag"));
    programAtmosphere = createProgram(vert, tesc, tese, frag);
    
    vert = compileShader(GL_VERTEX_SHADER, Loader::text(prefix + "stars.vert"));
    frag = compileShader(GL_FRAGMENT_SHADER, Loader::text(prefix + "stars.frag"));
    programStars = createProgram(vert, frag);

    glCreateVertexArrays(1, &vao);
    float distance = 400;

    vector<vec4> vec;
    vec.reserve(starCount);
    for (int i = 0; i<starCount; i++) {
      float a = ((float)rand() / RAND_MAX - 0.5);
      float b = ((float)rand() / RAND_MAX - 0.5);
      float c = ((float)rand() / RAND_MAX - 0.5);
      float d = (float)rand() / RAND_MAX * 5 + 1;

      vec4 v(a, b, c, 0);
      v = normalize(v);
      v *= distance;
      v.w = d;

      vec.push_back(v);
    }

    glCreateBuffers(1, &vbo);
    glNamedBufferData(vbo, sizeof(vec4)*vec.size(), vec.data(), GL_STATIC_DRAW);

    glVertexArrayVertexBuffer(vao, 0, vbo, 0, sizeof(vec4));
    glVertexArrayAttribFormat(vao, 0, 4, GL_FLOAT, 0, 0);
    glEnableVertexArrayAttrib(vao, 0);
    glBindVertexArray(vao);
  });
  app.addUpdateCallback([&](float dt) {
    manipulator.update(dt);
  });
  app.addDrawCallback([&]() {
    int w = mainWindow->getWidth();
    int h = mainWindow->getHeight();
    glViewport(0, 0, w, h);

    glClearColor(0, 0, 0, 1);
    glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

    glEnable(GL_DEPTH_TEST);
    glEnable(GL_CULL_FACE);

    glPolygonMode(GL_FRONT_AND_BACK, wireframe ? GL_LINE : GL_FILL);

    programStars.use();
    programStars.setMatrix4fv("v", value_ptr(cam.getView()));
    programStars.setMatrix4fv("p", value_ptr(cam.getProjection()));

    glEnable(GL_PROGRAM_POINT_SIZE);    
    glDrawArrays(GL_POINTS, 0, starCount);

    
    programPlanet.use();
    programPlanet.setMatrix4fv("v", value_ptr(cam.getView()));
    programPlanet.setMatrix4fv("p", value_ptr(cam.getProjection()));
    programPlanet.set3fv("camPos", value_ptr(cam.getEye()));
    programPlanet.set1i("seed", seed);
    programPlanet.set1f("time", app.getTimeFromStart());

    glPatchParameteri(GL_PATCH_VERTICES, 1);
    glDrawArraysInstanced(GL_PATCHES, 0, 1, 16);
    
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    programAtmosphere.use();
    programAtmosphere.setMatrix4fv("v", value_ptr(cam.getView()));
    programAtmosphere.setMatrix4fv("p", value_ptr(cam.getProjection()));
    programAtmosphere.set3fv("camPos", value_ptr(cam.getEye()));
    programAtmosphere.set1ui("seed", seed);
    programAtmosphere.set1f("time", app.getTimeFromStart());

    glPatchParameteri(GL_PATCH_VERTICES, 1);
    glDrawArrays(GL_PATCHES, 0, 1);
  });
  return app.run();
}