Пример #1
0
void
nsDOMCameraManager::Register(nsDOMCameraControl* aDOMCameraControl)
{
  DOM_CAMERA_LOGI(">>> Register( aDOMCameraControl = %p ) mWindowId = 0x%" PRIx64 "\n", aDOMCameraControl, mWindowId);
  MOZ_ASSERT(NS_IsMainThread());

  CameraControls* controls = sActiveWindows->Get(mWindowId);
  if (!controls) {
    controls = new CameraControls();
    sActiveWindows->Put(mWindowId, controls);
  }

  // Remove any stale CameraControl objects to limit our memory usage
  uint32_t i = controls->Length();
  while (i > 0) {
    --i;
    RefPtr<nsDOMCameraControl> cameraControl =
      do_QueryObject(controls->ElementAt(i));
    if (!cameraControl) {
      controls->RemoveElementAt(i);
    }
  }

  // Put the camera control into the hash table
  nsWeakPtr cameraControl =
    do_GetWeakReference(static_cast<DOMMediaStream*>(aDOMCameraControl));
  controls->AppendElement(cameraControl);
}
Пример #2
0
void
nsDOMCameraManager::Register(nsDOMCameraControl* aDOMCameraControl)
{
  DOM_CAMERA_LOGI(">>> Register( aDOMCameraControl = %p ) mWindowId = 0x%llx\n", aDOMCameraControl, mWindowId);
  MOZ_ASSERT(NS_IsMainThread());

  // Put the camera control into the hash table
  CameraControls* controls = sActiveWindows->Get(mWindowId);
  if (!controls) {
    controls = new CameraControls;
    sActiveWindows->Put(mWindowId, controls);
  }
  controls->AppendElement(aDOMCameraControl);
}
Пример #3
0
void
nsDOMCameraManager::Shutdown(uint64_t aWindowId)
{
  DOM_CAMERA_LOGI(">>> Shutdown( aWindowId = 0x%llx )\n", aWindowId);
  MOZ_ASSERT(NS_IsMainThread());

  CameraControls* controls = sActiveWindows->Get(aWindowId);
  if (!controls) {
    return;
  }

  uint32_t length = controls->Length();
  for (uint32_t i = 0; i < length; i++) {
    nsRefPtr<nsDOMCameraControl> cameraControl = controls->ElementAt(i);
    cameraControl->Shutdown();
  }
  controls->Clear();

  sActiveWindows->Remove(aWindowId);
}
Пример #4
0
void
nsDOMCameraManager::Shutdown(uint64_t aWindowId)
{
  DOM_CAMERA_LOGI(">>> Shutdown( aWindowId = 0x%" PRIx64 " )\n", aWindowId);
  MOZ_ASSERT(NS_IsMainThread());

  CameraControls* controls = sActiveWindows->Get(aWindowId);
  if (!controls) {
    return;
  }

  uint32_t i = controls->Length();
  while (i > 0) {
    --i;
    RefPtr<nsDOMCameraControl> cameraControl =
      do_QueryObject(controls->ElementAt(i));
    if (cameraControl) {
      cameraControl->Shutdown();
    }
  }
  controls->Clear();

  sActiveWindows->Remove(aWindowId);
}
int main(int argc, char *argv[])
{
	// Initialize SDL and GLEW
	initializeSDLAndGLEW();

	checkForErrors();

	elementCount = sizeof(elements) / sizeof(elements[0]);
	GLfloat lodFactor = 50;

	glEnable(GL_DEPTH_TEST);
	glEnable(GL_CULL_FACE);

	// Create VAOs and VBOs
	GLuint vao;
	glGenVertexArrays(1, &vao);
	glBindVertexArray(vao);
	GLuint vaos[1] =
	{
		vao
	};

	GLuint vbo, ebo;
	glGenBuffers(1, &vbo);
	glBindBuffer(GL_ARRAY_BUFFER, vbo);
	glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

	glGenBuffers(1, &ebo);
	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
	glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);
	GLuint vbos[] =
	{
		vbo,
		ebo
	};

	checkForErrors();

	// Create and compile shaders
	GLuint vertexShader, tessContShader, tessEvalShader, geometryShader, fragmentShader;
	std::string src;
	src = readShaderSrcFromFile("vs", src);
	vertexShader = createCompileShader(GL_VERTEX_SHADER, src.c_str());
	src = readShaderSrcFromFile("tcs", src);
	tessContShader = createCompileShader(GL_TESS_CONTROL_SHADER, src.c_str());
	src = readShaderSrcFromFile("tes", src);
	tessEvalShader = createCompileShader(GL_TESS_EVALUATION_SHADER, src.c_str());
	src = readShaderSrcFromFile("gs", src);
	geometryShader = createCompileShader(GL_GEOMETRY_SHADER, src.c_str());
	src = readShaderSrcFromFile("fs", src);
	fragmentShader = createCompileShader(GL_FRAGMENT_SHADER, src.c_str());

	GLuint shaders[5] =
	{
		vertexShader,
		tessContShader,
		tessEvalShader,
		geometryShader,
		fragmentShader
	};

	checkForErrors();

	// Create, link and use program(s). Note that the latest one is currently in use
	// because the function calls glUseProgram() just before return.
	GLsizei nElems = sizeof(shaders) / sizeof(shaders[0]);
	GLuint shaderProgram = createLinkUseProgram(shaders, nElems);
	GLuint programs[1] =
	{
		shaderProgram
	};
	checkForErrors();

	// Get uniform locations
	uniforms.projection = glGetUniformLocation(shaderProgram, "projection");
	uniforms.view = glGetUniformLocation(shaderProgram, "view");
	uniforms.lodFactor = glGetUniformLocation(shaderProgram, "lodFactor");
	uniforms.cameraPosition = glGetUniformLocation(shaderProgram, "cameraPos");
	uniforms.normal = glGetUniformLocation(shaderProgram, "normalMatrix");
	uniforms.lightPosition = glGetUniformLocation(shaderProgram, "lightPosition");
	uniforms.ambientMaterial = glGetUniformLocation(shaderProgram, "ambientMaterial");
	uniforms.diffuseMaterial = glGetUniformLocation(shaderProgram, "diffuseMaterial");
	uniforms.specularMaterial = glGetUniformLocation(shaderProgram, "specularMaterial");
	uniforms.shininess = glGetUniformLocation(shaderProgram, "shininess");
	uniforms.wireFrame = glGetUniformLocation(shaderProgram, "wireFrame");

	checkForErrors();

	// Specify the layout of the vertex data
	GLint posAttrib = glGetAttribLocation(shaderProgram, "position");
	glEnableVertexAttribArray(posAttrib);
	glVertexAttribPointer(posAttrib, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), 0);

	checkForErrors();

	// Create view matrix
	viewMat = glm::lookAt(
		glm::vec3(1.0f, 1.0f, 1.0f),
		glm::vec3(0.0f, 0.0f, 0.0f),
		glm::vec3(0.0f, 0.0f, 1.0f)
		);

	// Create projection matrix
	projectionMat = glm::perspective(glm::radians(45.0f),
		GLfloat(width) / GLfloat(height), 0.01f, 200.0f);

	// Create light position vector
	static glm::vec4 lightPosition = glm::vec4(0.25, 0.25, 1, 0);

	checkForErrors();

	// Set a bunch of uniforms
	glUniform3f(uniforms.ambientMaterial, 0.05f, 0.05f, 0.2f);
	glUniform3f(uniforms.diffuseMaterial, 1.0, 0.0, 0.0);
	glUniform3fv(uniforms.lightPosition, 1, glm::value_ptr(lightPosition));
	glUniform1f(uniforms.lodFactor, lodFactor);
	glUniform1i(uniforms.wireFrame, wireFrame);
	glUniform3f(uniforms.specularMaterial, 0.5f, 0.5f, 0.5f);
	glUniform1f(uniforms.shininess, 100.0f);
	glUniformMatrix4fv(uniforms.view, 1, GL_FALSE, glm::value_ptr(viewMat));
	glUniformMatrix4fv(uniforms.projection, 1, GL_FALSE, glm::value_ptr(projectionMat));

	checkForErrors();

	while (!quit) {
		while (SDL_PollEvent(&e) != 0) {
			if (e.type == SDL_QUIT || e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_ESCAPE)
			{
				quit = GL_TRUE;
			}
			if (e.type == SDL_KEYDOWN && e.key.keysym.sym == SDLK_g)
			{
				if (wireFrame)
				{
					wireFrame = 0;
					std::cout << "Wireframe status: " << wireFrame << std::endl;
				}
				else
				{
					wireFrame = 1;
					std::cout << "Wireframe status: " << wireFrame << std::endl;
				}
			}
			cameraControls.handleEvent(e);
		}
		cameraControls.updatePosition();
		cameraControls.mouseMovement(width, height, window);

		// Calculate new view and normal matrices
		viewMat = glm::lookAt(
			cameraControls.getCameraPosition(),
			cameraControls.getCameraPosition() + cameraControls.getLookDirection(),
			glm::vec3(0.0f, 0.0f, 1.0f)
			);
		normalMat = glm::mat3(glm::transpose(glm::inverse(viewMat)));
		
		// Set some uniforms that may have changed
		glUniformMatrix4fv(uniforms.view, 1, GL_FALSE, glm::value_ptr(viewMat));
		glUniformMatrix3fv(uniforms.normal, 1, GL_FALSE, glm::value_ptr(normalMat));
		glUniform3fv(uniforms.cameraPosition, 1, glm::value_ptr(cameraControls.getCameraPosition()));
		glUniform1i(uniforms.wireFrame, wireFrame);

		glClearColor(0.05f, 0.05f, 0.2f, 1.0f);
		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
		glDrawElements(GL_PATCHES, elementCount, GL_UNSIGNED_INT, 0);

		SDL_GL_SwapWindow(window);
	}
	GLsizei lengthP = sizeof(programs) / sizeof(programs[0]);
	GLsizei lengthS = sizeof(shaders) / sizeof(shaders[0]);
	GLsizei lengthVBO = sizeof(vbos) / sizeof(vbos[0]);
	GLsizei lengthVAO = sizeof(vaos) / sizeof(vaos[0]);
	GLsizei lengths[4] = 
	{
		lengthP,
		lengthS,
		lengthVBO,
		lengthVAO
	};
	cleanUpAndQuit(programs, shaders, vbos, vaos, lengths);

	return 0;
}