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;
}
示例#2
0
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);
}