void rwxGLView::DrawReconditeScene(){ PrepareToDraw(); DrawScene(); SwapBuffers(); }
OSErr DrawMaps(WindowPtr w, Rect r, WorldRect view, Boolean printing) { long i; OSErr err = 0; sharedPrinting = printing; sharedView = view; PrepareToDraw(r, view, 0, 0); if (model) model->Draw(r, view); sharedPrinting = FALSE; return err; }
/*********************************************************************************** Function Name : DrawTexture Inputs : Outputs : Returns : Description : ************************************************************************************/ static IMG_VOID DrawTexture(GLES1Context *gc, GLfloat fXs, GLfloat fYs, GLfloat fZs, GLfloat fWidth, GLfloat fHeight) { GLESViewport *psViewport; IMG_FLOAT *pfVertexData, fScreenHeight; IMG_UINT32 ui32Unit, ui32VertexDWords, i; IMG_UINT16 *pui16Indices; IMG_UINT32 *pui32Indices; IMG_UINT32 ui32NoClears = 0; IMG_FLOAT fNewWidth, fNewHeight, fNewXs, fNewYs; if ((fWidth<=0.0f) || (fHeight<=0.0f)) { SetError(gc, GL_INVALID_VALUE); return; } /* Nothing to do if the X.Y offset is outside the drawable */ if((fXs >= (IMG_FLOAT)gc->psDrawParams->ui32Width) || (fYs >= (IMG_FLOAT)gc->psDrawParams->ui32Height)) { return; } if(!PrepareToDraw(gc, &ui32NoClears, IMG_TRUE)) { PVR_DPF((PVR_DBG_ERROR,"DrawTexture: Can't prepare to draw")); return; } if(gc->sPrim.eCurrentPrimitiveType!=GLES1_PRIMTYPE_DRAWTEXTURE) { gc->sPrim.eCurrentPrimitiveType = GLES1_PRIMTYPE_DRAWTEXTURE; gc->ui32DirtyMask |= GLES1_DIRTYFLAG_VAO_ATTRIB_STREAM | GLES1_DIRTYFLAG_VP_STATE | GLES1_DIRTYFLAG_VERTEX_PROGRAM; if (gc->ui32RasterEnables & GLES1_RS_POLYOFFSET_ENABLE) { gc->ui32DirtyMask |= GLES1_DIRTYFLAG_RENDERSTATE; } gc->ui32EmitMask |= GLES1_EMITSTATE_MTE_STATE_CONTROL; } else { gc->ui32DirtyMask |= GLES1_DIRTYFLAG_VAO_ATTRIB_POINTER | GLES1_DIRTYFLAG_VP_STATE | GLES1_DIRTYFLAG_VERTEX_PROGRAM; } if(gc->ui32DirtyMask) { ValidateState(gc); } if (!gc->ui32NumImageUnitsActive) { PVR_DPF((PVR_DBG_WARNING,"DrawTexture: No textures enabled")); PVRSRVUnlockMutex(gc->psRenderSurface->hMutex); return; } /* Colour(4) + 4 * (position(4) + each texture layer (4)) */ ui32VertexDWords = 4 + (4 * (4 + (4 * gc->ui32NumImageUnitsActive))); pfVertexData = (IMG_FLOAT *) CBUF_GetBufferSpace(gc->apsBuffers, ui32VertexDWords, CBUF_TYPE_VERTEX_DATA_BUFFER, IMG_FALSE); if(!pfVertexData) { PVR_DPF((PVR_DBG_ERROR,"DrawTexture: Can't get vertex buffer space")); SetError(gc, GL_OUT_OF_MEMORY); PVRSRVUnlockMutex(gc->psRenderSurface->hMutex); return; } pui32Indices = CBUF_GetBufferSpace(gc->apsBuffers, 2, CBUF_TYPE_INDEX_DATA_BUFFER, IMG_FALSE); if(!pui32Indices) { PVR_DPF((PVR_DBG_ERROR,"DrawTexture: Can't get index buffer space")); SetError(gc, GL_OUT_OF_MEMORY); PVRSRVUnlockMutex(gc->psRenderSurface->hMutex); return; } gc->sPrim.pvDrawTextureAddr = pfVertexData; pui16Indices = (IMG_UINT16 *)pui32Indices; /* ** Clamp Z */ psViewport = &gc->sState.sViewport; if (fZs<=0.0f) { fZs = psViewport->fZNear; } else if (fZs>1.0f) { fZs = psViewport->fZFar; } else { fZs = psViewport->fZNear + fZs*(psViewport->fZFar - psViewport->fZNear); } /* ** Current color for all vertices */ pfVertexData[0] = gc->sState.sCurrent.asAttrib[AP_COLOR].fX; pfVertexData[1] = gc->sState.sCurrent.asAttrib[AP_COLOR].fY; pfVertexData[2] = gc->sState.sCurrent.asAttrib[AP_COLOR].fZ; pfVertexData[3] = gc->sState.sCurrent.asAttrib[AP_COLOR].fW; /* ** Calculate the strip's window coordinates ** ** Clip primitive to screen boundary to prevent guard band clamping ** from moving the vertices (but not moving the texcoords) */ fNewXs = fXs; fNewYs = fYs; fNewWidth = fWidth; fNewHeight = fHeight; if(fNewXs < 0.0f) { fNewWidth += fNewXs; fNewXs = 0.0f; } if(fNewYs < 0.0f) { fNewHeight += fNewYs; fNewYs = 0.0f; } fScreenHeight = (IMG_FLOAT)gc->psDrawParams->ui32Height; if((fNewXs + fNewWidth) > (IMG_FLOAT)gc->psDrawParams->ui32Width) { fNewWidth = (IMG_FLOAT)gc->psDrawParams->ui32Width - fNewXs; } if((fNewYs + fNewHeight) > fScreenHeight) { fNewHeight = fScreenHeight - fNewYs; } if(gc->psDrawParams->eRotationAngle!=PVRSRV_FLIP_Y) { pfVertexData[4] = fNewXs; pfVertexData[5] = fScreenHeight - fNewYs; pfVertexData[6] = fZs; pfVertexData[7] = 1.0f; pfVertexData[8] = fNewXs; pfVertexData[9] = fScreenHeight - (fNewYs + fNewHeight); pfVertexData[10] = fZs; pfVertexData[11] = 1.0f; pfVertexData[12] = fNewXs + fNewWidth; pfVertexData[13] = fScreenHeight - fNewYs; pfVertexData[14] = fZs; pfVertexData[15] = 1.0f; pfVertexData[16] = fNewXs + fNewWidth; pfVertexData[17] = fScreenHeight - (fNewYs + fNewHeight); pfVertexData[18] = fZs; pfVertexData[19] = 1.0f; } else { pfVertexData[4] = fNewXs; pfVertexData[5] = fNewYs; pfVertexData[6] = fZs; pfVertexData[7] = 1.0f; pfVertexData[8] = fNewXs; pfVertexData[9] = fNewYs + fNewHeight; pfVertexData[10] = fZs; pfVertexData[11] = 1.0f; pfVertexData[12] = fNewXs + fNewWidth; pfVertexData[13] = fNewYs; pfVertexData[14] = fZs; pfVertexData[15] = 1.0f; pfVertexData[16] = fNewXs + fNewWidth; pfVertexData[17] = fNewYs + fNewHeight; pfVertexData[18] = fZs; pfVertexData[19] = 1.0f; } pfVertexData += 20; /* ** Calculate the strip's texture coordinates */ for (i=0; i<gc->ui32NumImageUnitsActive; i++) { GLESTexture *psTex; GLESTextureParamState *psParamState; IMG_FLOAT fX0, fX1, fY0, fY1, fWt, fHt; ui32Unit = gc->ui32TexImageUnitsEnabled[i]; psTex = gc->sTexture.apsBoundTexture[ui32Unit][gc->sTexture.aui32CurrentTarget[ui32Unit]]; psParamState = &psTex->sState; fWt = (IMG_FLOAT)psTex->psMipLevel[0].ui32Width; fHt = (IMG_FLOAT)psTex->psMipLevel[0].ui32Height; /* ** s = (Ucr + (X - Xs)*(Wcr/Ws)) / Wt ** t = (Vcr + (Y - Ys)*(Hcr/Hs)) / Ht ** r = 0 ** q = 1 */ fX0 = ((IMG_FLOAT)psParamState->i32CropRectU + (fNewXs - fXs) * ((IMG_FLOAT)psParamState->i32CropRectW / fWidth)) / fWt; fX1 = ((IMG_FLOAT)psParamState->i32CropRectU + (fNewXs + fNewWidth - fXs) * ((IMG_FLOAT)psParamState->i32CropRectW / fWidth)) / fWt; fY0 = ((IMG_FLOAT)psParamState->i32CropRectV + (fNewYs - fYs) * ((IMG_FLOAT)psParamState->i32CropRectH / fHeight)) / fHt; fY1 = ((IMG_FLOAT)psParamState->i32CropRectV + (fNewYs + fNewHeight - fYs) * ((IMG_FLOAT)psParamState->i32CropRectH / fHeight)) / fHt; pfVertexData[0] = fX0; pfVertexData[1] = fY0; pfVertexData[2] = 0.0f; pfVertexData[3] = 1.0f; pfVertexData[4] = fX0; pfVertexData[5] = fY1; pfVertexData[6] = 0.0f; pfVertexData[7] = 1.0f; pfVertexData[8] = fX1; pfVertexData[9] = fY0; pfVertexData[10] = 0.0f; pfVertexData[11] = 1.0f; pfVertexData[12] = fX1; pfVertexData[13] = fY1; pfVertexData[14] = 0.0f; pfVertexData[15] = 1.0f; pfVertexData += 16; } /* ** Indices for the strip */ pui16Indices[0] = 0; pui16Indices[1] = 1; pui16Indices[2] = 2; pui16Indices[3] = 3; /* Attach all used resources to the current surface */ AttachAllUsedResourcesToCurrentSurface(gc); /* Emit state */ GLES1EmitState(gc, 4, CBUF_GetBufferDeviceAddress(gc->apsBuffers, pui32Indices, CBUF_TYPE_INDEX_DATA_BUFFER), 0); CBUF_UpdateBufferPos(gc->apsBuffers, ui32VertexDWords, CBUF_TYPE_VERTEX_DATA_BUFFER); GLES1_INC_COUNT(GLES1_TIMER_VERTEX_DATA_COUNT, ui32VertexDWords); CBUF_UpdateBufferPos(gc->apsBuffers, 2, CBUF_TYPE_INDEX_DATA_BUFFER); GLES1_INC_COUNT(GLES1_TIMER_INDEX_DATA_COUNT, 2); /* Update vertex and index buffers committed primitive offset */ CBUF_UpdateVIBufferCommittedPrimOffsets(gc->apsBuffers, &gc->psRenderSurface->bPrimitivesSinceLastTA, (IMG_VOID *)gc, KickLimit_ScheduleTA); PVRSRVUnlockMutex(gc->psRenderSurface->hMutex); }