Beispiel #1
0
	virtual void OnKeyPressed(KEY key)
	{
		float offsetStep = 0.1f * m_scale;
		const float scaleStep = 0.4f;

		switch (key)
		{
		case KEY::KEY_ESCAPE:
			m_backend->Terminate();
			break;

		case KEY::KEY_UP:
			m_offset.y -= offsetStep;
			m_shaderProgram->SetOffset(m_offset);
			break;
		case KEY::KEY_DOWN:
			m_offset.y += offsetStep;
			m_shaderProgram->SetOffset(m_offset);
			break;
		case KEY::KEY_LEFT:
			m_offset.x += offsetStep;
			m_shaderProgram->SetOffset(m_offset);
			break;
		case KEY::KEY_RIGHT:
			m_offset.x -= offsetStep;
			m_shaderProgram->SetOffset(m_offset);
			break;

		case KEY::KEY_q:
			m_scale += scaleStep;
			m_shaderProgram->SetScale(m_scale);
			break;
		case KEY::KEY_w:
			m_scale -= scaleStep;
			m_shaderProgram->SetScale(m_scale);
			break;
		case KEY::KEY_s:
			m_pause = !m_pause;
			break;
		}
	}
Beispiel #2
0
	virtual void OnMouseMove(int x, int y)
	{
		if (m_keyLeftPressed)
		{
			//Two is a magic! 
			float wk = 1.0f / m_win_h * m_scale * 2.0f;
			float hk = 1.0f / m_win_h * m_scale * 2.0f;
			m_offset.x -= (m_mouse_x - x)*wk;
			m_offset.y += (m_mouse_y - y)*hk;
			m_shaderProgram->SetOffset(m_offset);
			m_mouse_x = x;
			m_mouse_y = y;
		}
	}
Beispiel #3
0
	bool Init(int argc, char** argv)
	{
		GetCLDev();

		m_backend->Init(argc, argv);
		m_aspectRatio = m_win_h / (float)m_win_w;

		if (!m_backend->CreateWin(m_win_w, m_win_h, false, "OpenGL test app"))
		{
			fprintf(stderr, "Faild to create window");
			return false;
		}

		GLenum res = glewInit();
		if (res != GLEW_OK) {
			fprintf(stderr, "Error: '%s'\n", glewGetErrorString(res));
			return false;
		}

		if (!InitCL())
		{
			return false;
		}

		wglSwapIntervalEXT(0);

		glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
		glEnable(GL_BLEND);
		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
		//glFrontFace(GL_CW);
		//glCullFace(GL_BACK);
		//glEnable(GL_CULL_FACE);

		//glEnable(GL_DEPTH_TEST);

		m_bodies.push_back(Body(Vector2f(-0.8f, -0.8f), Vector2f(0.021f, 0.0f), Vector2f(-0.05f, 0.11f), Vector2f(0.0f, 0.0f)));
		m_bodies.push_back(Body(Vector2f(0.8f, 0.8f), Vector2f(0.021f, 0.0f), Vector2f(0.05f, -0.11f), Vector2f(0.0f, 0.0f)));
		m_bodies.push_back(Body(Vector2f(-0.8f, 0.8f), Vector2f(0.014f, 0.0f), Vector2f(0.01f, 0.1f), Vector2f(0.0f, 0.0f)));
		m_bodies.push_back(Body(Vector2f(0.8f, -0.8f), Vector2f(0.016f, 0.0f), Vector2f(0.01f, 0.1f), Vector2f(0.0f, 0.0f)));
		m_bodies.push_back(Body(Vector2f(0.0f, 0.0f), Vector2f(0.3f, 0.0f), Vector2f(0.0f, 0.0f), Vector2f(0.0f, 0.0f)));

		for (int i = 0; i < 5000; ++i)
		{
			m_bodies.push_back(Body(Vector2f((rand() % 100000) / 1000.0f - 1.0f, (rand() % 100000) / 1000.0f - 1.0f), Vector2f(rand() % 300 / 1000.0f, 0.0f), Vector2f((rand() % 2000) / 1000.0f - 1.0f, (rand() % 2000) / 1000.0f - 1.0f), Vector2f(0.0f, 0.0f)));
		}

		glGenBuffers(1, &m_VB);
		glBindBuffer(GL_ARRAY_BUFFER, m_VB);
		glBufferData(GL_ARRAY_BUFFER, sizeof(Body) * m_bodies.size(), &m_bodies[0], GL_DYNAMIC_DRAW);

		cl_int ret = 0;
		m_clVB = clCreateFromGLBuffer(m_clContext, CL_MEM_READ_WRITE, m_VB, &ret);
		clErrNoAssert(ret);
		ret = clSetKernelArg(m_kernelCalcForces, 0, sizeof(cl_mem), (void *)&m_clVB);
		clErrNoAssert(ret);
		ret = clSetKernelArg(m_kernelMove, 0, sizeof(cl_mem), (void *)&m_clVB);
		clErrNoAssert(ret);

		m_last_time_dt = 0;
		m_time_shift = 1;
		m_dt = 0.00001f;

		m_shaderProgram = new CommonShaderProgram("vertexshader.txt", "pixelshader.txt", "geometryshader.txt");
		m_shaderProgram->Compile();
		m_shaderProgram->Apply();
		m_shaderProgram->SetScale(m_scale);
		m_shaderProgram->SetOffset(m_offset);
		m_shaderProgram->SetAspectRatio(m_aspectRatio);

		return true;
	}