Beispiel #1
0
	//TODO: drive this with a generic VBO descriptor to avoid special case drawing like these particles
	static void DrawParticles( const DrawParticlesCommand &cmd ) {
		if ( !cmd.material ) {
			console.Print( PrintLevel::Developer, "%s with invalid material\n",
				XS_FUNCTION
			);
			return;
		}

		cmd.material->Bind();

		bool setWireframe = false;
		bool previousWireframe = false;
		if ( r_wireframe->GetBool() || (cmd.material->flags & MF_WIREFRAME) ) {
			setWireframe = true;
			previousWireframe = GetWireframe();
			ToggleWireframe( true );
		}

		if ( cmd.vbo ) {
			cmd.vbo->Bind();

			// position4, uv2, colour4
			EnableVertexAttribs( VERTEX_ATTRIB_0 | VERTEX_ATTRIB_1 | VERTEX_ATTRIB_2 );

			// calculate stride
			GLsizei stride = sizeof(vector4) + sizeof(vector2) + sizeof(vector4);

			// set the attribute pointers
			size_t offset = 0u;
			glVertexAttribPointer( 0, 4, GL_FLOAT, GL_FALSE, stride, reinterpret_cast<const GLvoid *>( offset ) );
			offset += sizeof(vector4);

			glVertexAttribPointer( 1, 2, GL_FLOAT, GL_FALSE, stride, reinterpret_cast<const GLvoid *>( offset ) );
			offset += sizeof(vector2);

			glVertexAttribPointer( 2, 4, GL_FLOAT, GL_FALSE, stride, reinterpret_cast<const GLvoid *>( offset ) );
			offset += sizeof(vector4);
		}

		if ( 1 ) {
			cmd.ibo->Bind();
			GLint size = 0;
			glGetBufferParameteriv( GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size );
			glDrawElements( GL_TRIANGLES, size / sizeof(uint32_t), GL_UNSIGNED_INT, 0 );
		}
		else {
			glDrawArrays( GL_TRIANGLES, 0, cmd.count );
		}

		// clean up state
		if ( setWireframe ) {
			ToggleWireframe( previousWireframe );
		}
	}
void StateRenderTest::Update(beStateMachine* stateMachine, float dt)
{
	auto gamepad = m_appData->gamepad;
	auto keyboard = m_appData->keyboard;
	auto mouse = m_appData->mouse;
	auto renderInterface = m_appData->renderInterface;

	if (gamepad->GetPressed(beGamepad::A) || keyboard->IsPressed(beKeyboard::Button::W))
	{
		renderInterface->ToggleWireframe();
	}
	if (keyboard->IsPressed(beKeyboard::Button::G))
	{
		m_renderGrid = !m_renderGrid;
	}
	if (keyboard->IsPressed(beKeyboard::Button::F))
	{
		m_showGroundFilled = !m_showGroundFilled;
		m_gridModel.SetMeshVisibility("GroundFilled", m_showGroundFilled);
	}

	if (gamepad->GetPressed(beGamepad::B) || keyboard->IsPressed(beKeyboard::Button::Escape))
	{
		stateMachine->ChangeState(nullptr);
		return;
	}
	if (gamepad->GetPressed(beGamepad::Y))
	{
		const int shader = ((int)m_shaderToUse + 1) % (int)beRendering::ShaderType::Count;
		m_shaderToUse = (beRendering::ShaderType)shader;
	}
	if (gamepad->GetPressed(beGamepad::X) || mouse->IsPressed(beMouse::Button::MiddleButton))
	{
		m_modelToUse++;
		m_modelToUse %= m_models.Count() + 1;
	}
	if (gamepad->GetPressed(beGamepad::Select))
	{
		m_renderAxes = !m_renderAxes;
	}
	if (gamepad->GetPressed(beGamepad::Up))
	{
		m_bitmapTexQuadNorm.SetPosition(m_bitmapTexQuadNorm.GetPosition() + Vec2(0.f, 0.1f));
		m_bitmapTexQuadPixelCoord.SetPosition(m_bitmapTexQuadPixelCoord.GetPosition() + Vec2(0.f, 20.f));
	}
	if (gamepad->GetPressed(beGamepad::Down))
	{
		m_bitmapTexQuadNorm.SetPosition(m_bitmapTexQuadNorm.GetPosition() - Vec2(0.f, 0.1f));
		m_bitmapTexQuadPixelCoord.SetPosition(m_bitmapTexQuadPixelCoord.GetPosition() - Vec2(0.f, 20.f));
	}
	if (gamepad->GetPressed(beGamepad::Left))
	{
		m_bitmapTexQuadNorm.SetPosition(m_bitmapTexQuadNorm.GetPosition() - Vec2(0.1f, 0.f));
		m_bitmapTexQuadPixelCoord.SetPosition(m_bitmapTexQuadPixelCoord.GetPosition() - Vec2(20.f, 0.f));
	}
	if (gamepad->GetPressed(beGamepad::Right))
	{
		m_bitmapTexQuadNorm.SetPosition(m_bitmapTexQuadNorm.GetPosition() + Vec2(0.1f, 0.f));
		m_bitmapTexQuadPixelCoord.SetPosition(m_bitmapTexQuadPixelCoord.GetPosition() + Vec2(20.f, 0.f));
	}

	if (mouse->IsPressed(beMouse::LeftButton))
	{
		//auto window = m_appData->window;
		const float screenX = (float)mouse->GetX();// -window->GetX();
		const float screenY = (float)mouse->GetY();// - window->GetY();
		Vec3 worldPos, worldDir;
		const bool isInBounds = beCameraUtils::GetScreeenToWorldRay(*renderInterface, m_camera.GetViewMatrix(), screenX, screenY, &worldPos, &worldDir);
		if (isInBounds)
		{
			//LOG("MOUSE CLICK: (%.2f, %.2f) POS:{%3.3f, %3.3f, %3.3f} dir:{%3.3f, %3.3f, %3.3f}\r\n", screenX, screenY, worldPos.x, worldPos.y, worldPos.z, worldDir.x, worldDir.y, worldDir.z);
			//LOG("MOUSE Deets:");
			PositionFromMatrix(m_camera.GetViewMatrix());
		}

		//if (auto realWorldPos = beCameraUtils::WorldPosFromScreenPos(*renderInterface, m_camera.GetViewMatrix(), m_camera.GetPosition(), screenX, screenY))
		//{

		//	LOG("Collision! mouse pos:{%.3f, %.3f, %.3f} World collision at:{%3.3f, %3.3f, %3.3f}\r\n", m_camera.GetPosition().x, m_camera.GetPosition().y, m_camera.GetPosition().z, realWorldPos->x, realWorldPos->y, realWorldPos->z);
		//}
	}

	m_camera.Update(dt);

}
Beispiel #3
0
	static void DrawMesh( const Mesh *mesh ) {
		SDL_assert( mesh->material && "DrawMesh with invalid material" );

		bool setWireframe = false;
		bool previousWireframe = false;
		if ( r_wireframe->GetBool() || (mesh->material->flags & MF_WIREFRAME) ) {
			setWireframe = true;
			previousWireframe = GetWireframe();
			ToggleWireframe( true );
		}

		// bind the vertex/normal/uv buffers
		if ( mesh->vertexBuffer ) {
			const bool hasVerts = !mesh->vertices.empty();
			const bool hasNormals = !mesh->normals.empty();
			const bool hasUVs = !mesh->UVs.empty();

			mesh->vertexBuffer->Bind();

			uint32_t vertexAttribs = 0u;
			if ( hasVerts ) {
				vertexAttribs |= VERTEX_ATTRIB_0;
			}
			if ( hasNormals ) {
				vertexAttribs |= VERTEX_ATTRIB_1;
			}
			if ( hasUVs ) {
				vertexAttribs |= VERTEX_ATTRIB_2;
			}

			EnableVertexAttribs( vertexAttribs );

			// calculate stride
			GLsizei stride = 0;
			if ( hasVerts ) {
				stride += sizeof(vector3);
			}
			if ( hasNormals ) {
				stride += sizeof(vector3);
			}
			if ( hasUVs ) {
				stride += sizeof(vector2);
			}

			// set the attribute pointers
			size_t offset = 0u;
			if ( hasVerts ) {
				glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, stride, reinterpret_cast<const GLvoid *>( offset ) );
				offset += sizeof(vector3);
			}

			if ( hasNormals ) {
				glVertexAttribPointer( 1, 3, GL_FLOAT, GL_FALSE, stride, reinterpret_cast<const GLvoid *>( offset ) );
				offset += sizeof(vector3);
			}

			if ( hasUVs ) {
				glVertexAttribPointer( 2, 2, GL_FLOAT, GL_FALSE, stride, reinterpret_cast<const GLvoid *>( offset ) );
				offset += sizeof(vector2);
			}
		}

		// issue the draw command
		//FIXME: index buffer is all kinds of wrong when using glDrawElements
		if ( 0 ) {//mesh->indexBuffer ) {
			mesh->indexBuffer->Bind();
			GLint size = 0;
			glGetBufferParameteriv( GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size );
			glDrawElements( GL_TRIANGLES, size / sizeof(uint32_t), GL_UNSIGNED_INT, 0 );
		}
		else {
			glDrawArrays( GL_TRIANGLES, 0, mesh->indices.size() );
		}

		// clean up state
		if ( setWireframe ) {
			ToggleWireframe( previousWireframe );
		}
	}