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); }
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); }
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); }
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; }