int CHapticViewerView::drawSceneHL(Mesh* pObj) { int triDrawCount = 0; hlBeginFrame(); hlCheckEvents(); HLboolean buttDown; hlGetBooleanv(HL_BUTTON1_STATE, &buttDown); if (buttDown && pObj->isDragging) { updateDragObjectTransform(pObj); } if (m_bHapticCameraView) hlEnable(HL_HAPTIC_CAMERA_VIEW); else hlDisable(HL_HAPTIC_CAMERA_VIEW); if (m_bHapticAdaptiveViewport) hlEnable(HL_ADAPTIVE_VIEWPORT); else hlDisable(HL_ADAPTIVE_VIEWPORT); if (m_bShapeDepthBuffer) hlBeginShape(HL_SHAPE_DEPTH_BUFFER, pObj->shapeId); else hlBeginShape(HL_SHAPE_FEEDBACK_BUFFER, pObj->shapeId); const bool isHapticView = true; triDrawCount = drawSceneGL(pObj, isHapticView); hlEndShape(); hlEndFrame(); return triDrawCount; }
void TestPlugin::updateGeometry(const WebRect& frameRect, const WebRect& clipRect, const WebVector<WebRect>& cutOutsRects, bool isVisible) { if (clipRect == m_rect) return; m_rect = clipRect; if (m_rect.isEmpty()) { m_textureMailbox = cc::TextureMailbox(); } else if (m_context) { m_context->viewport(0, 0, m_rect.width, m_rect.height); m_context->bindTexture(GL_TEXTURE_2D, m_colorTexture); m_context->texParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); m_context->texParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); m_context->texParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); m_context->texParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); m_context->texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_rect.width, m_rect.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); m_context->bindFramebuffer(GL_FRAMEBUFFER, m_framebuffer); m_context->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_colorTexture, 0); drawSceneGL(); gpu::Mailbox mailbox; m_context->genMailboxCHROMIUM(mailbox.name); m_context->produceTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); m_context->flush(); uint32 syncPoint = m_context->insertSyncPoint(); m_textureMailbox = cc::TextureMailbox(mailbox, GL_TEXTURE_2D, syncPoint); } else { size_t bytes = 4 * m_rect.width * m_rect.height; scoped_ptr<base::SharedMemory> bitmap = RenderThread::Get()->HostAllocateSharedMemoryBuffer(bytes); if (!bitmap->Map(bytes)) { m_textureMailbox = cc::TextureMailbox(); } else { drawSceneSoftware(bitmap->memory(), bytes); m_textureMailbox = cc::TextureMailbox( bitmap.get(), gfx::Size(m_rect.width, m_rect.height)); m_sharedBitmap = bitmap.Pass(); } } m_mailboxChanged = true; m_layer->SetNeedsDisplay(); }
//////////////////////////////////////////////////////////////////////////// // CHapticViewerView drawing // void CHapticViewerView::OnDraw(CDC* pDC) { CHapticViewerDoc* pDoc = GetDocument(); // Ceck pauseDraw to see if drawing should be paused to allow the user to // respond to an error message box. if (pDoc->m_pauseDraw) return; Mesh* pObj = pDoc->getObj(); wglMakeCurrent(m_hDC,m_hRC); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if (pObj) { static double s_hlElapsed = 0.0; static double s_glElapsed = 0.0; static double s_totalElapsed = 0.0; static int s_hlTriCount = 0; static int s_glTriCount = 0; int hlTriCount = 0; int glTriCount = 0; double hlElapsed = 0.0; double glElapsed = 0.0; double totalElapsed = 0.0; // Manage how often to update performance number to avoid smearing. const double showPerfNumSec = 0.25; LARGE_INTEGER startHapticli, startGraphicli, startTotalli, endli; QueryPerformanceCounter(&startTotalli); QueryPerformanceCounter(&startHapticli); // Single pass render for both haptics and graphics. m_bSinglePassRender = m_bShapeDepthBuffer && !m_bHapticCameraView; // // draw haptic scene // hlTriCount = drawSceneHL(pObj); QueryPerformanceCounter(&endli); hlElapsed = double(_int64(endli.QuadPart - startHapticli.QuadPart)) / g_liFreq.QuadPart; // // draw graphic scene // QueryPerformanceCounter(&startGraphicli); if (!m_bSinglePassRender) { // Use render produced by drawSceneHL (single pass render). glPushAttrib(GL_POLYGON_BIT); { if (m_bWireframe) { glPolygonMode(GL_FRONT, GL_LINE); } const bool isHapticView = false; glTriCount = drawSceneGL(pObj, isHapticView); } glPopAttrib(); } drawCursorGL(); // Draw the frustum (if desired). if (m_bHapticCameraVisual) { glPushMatrix(); glMultMatrixd(pObj->transform); drawFrustum(m_hapticCameraFrustum); glPopMatrix(); } glFinish(); QueryPerformanceCounter(&endli); glElapsed = double(_int64(endli.QuadPart - startGraphicli.QuadPart)) / g_liFreq.QuadPart; totalElapsed = double(_int64(endli.QuadPart - startTotalli.QuadPart)) / g_liFreq.QuadPart; // QueryPerformanceCounter(&endli); double perfElapsed = double(_int64(endli.QuadPart - g_drawPerfli.QuadPart)) / g_liFreq.QuadPart; if ((perfElapsed > showPerfNumSec) && (hlTriCount > 0 || glTriCount > 0)) { QueryPerformanceCounter(&g_drawPerfli); s_hlElapsed = hlElapsed; s_glElapsed = glElapsed; s_totalElapsed = totalElapsed; s_hlTriCount = hlTriCount; s_glTriCount = glTriCount; } if (m_bPerformance) { drawPerformance(s_hlElapsed, s_glElapsed, s_totalElapsed, s_hlTriCount, s_glTriCount); } Invalidate(FALSE); } SwapBuffers(m_hDC); }