📄 vs_gl_draw.c
字号:
for (i=0; i<mesh->i_count; i+=3) { for (j=0; j<3; j++) { pt = mesh->vertices[idx[j]].pos; end = gf_vec_scale(mesh->vertices[idx[j]].normal, scale); gf_vec_add(end, pt, end);#ifdef GPAC_USE_OGL_ES va[0] = pt; va[1] = end; indices[0] = 0; indices[1] = 1; glVertexPointer(3, GL_FIXED, 0, va); glDrawElements(GL_LINES, 2, GL_UNSIGNED_SHORT, indices);#else glBegin(GL_LINES); glVertex3f(FIX2FLT(pt.x), FIX2FLT(pt.y), FIX2FLT(pt.z)); glVertex3f(FIX2FLT(end.x), FIX2FLT(end.y), FIX2FLT(end.z)); glEnd();#endif } idx+=3; } } else { IDX_TYPE *idx = mesh->indices; for (i=0; i<mesh->i_count; i+=3) { gf_vec_add(pt, mesh->vertices[idx[0]].pos, mesh->vertices[idx[1]].pos); gf_vec_add(pt, pt, mesh->vertices[idx[2]].pos); pt = gf_vec_scale(pt, FIX_ONE/3); end = gf_vec_scale(mesh->vertices[idx[0]].normal, scale); gf_vec_add(end, pt, end);#ifdef GPAC_USE_OGL_ES va[0] = pt; va[1] = end; indices[0] = 0; indices[1] = 1; glVertexPointer(3, GL_FIXED, 0, va); glDrawElements(GL_LINES, 2, GL_UNSIGNED_SHORT, indices);#else glBegin(GL_LINES); glVertex3f(FIX2FLT(pt.x), FIX2FLT(pt.y), FIX2FLT(pt.z)); glVertex3f(FIX2FLT(end.x), FIX2FLT(end.y), FIX2FLT(end.z)); glEnd();#endif idx += 3; } }#ifdef GPAC_USE_OGL_ES ogles_pop_enable(attrib); glDisableClientState(GL_VERTEX_ARRAY);#else glPopAttrib();#endif}void VS3D_DrawAABBNodeBounds(RenderEffect3D *eff, AABBNode *node){ if (node->pos) { VS3D_DrawAABBNodeBounds(eff, node->pos); VS3D_DrawAABBNodeBounds(eff, node->neg); } else { SFVec3f c, s; gf_vec_diff(s, node->max, node->min); c = gf_vec_scale(s, FIX_ONE/2); gf_vec_add(c, node->min, c); glPushMatrix(); glTranslatef(FIX2FLT(c.x), FIX2FLT(c.y), FIX2FLT(c.z)); glScalef(FIX2FLT(s.x), FIX2FLT(s.y), FIX2FLT(s.z)); VS3D_DrawMeshIntern(eff, eff->surface->render->unit_bbox); glPopMatrix(); }}void VS3D_DrawMeshBoundingVolume(RenderEffect3D *eff, GF_Mesh *mesh){ SFVec3f c, s;#ifdef GPAC_USE_OGL_ES u32 atts = ogles_push_enable(GL_LIGHTING);#else glPushAttrib(GL_ENABLE_BIT);#endif if (mesh->aabb_root && (eff->surface->render->compositor->draw_bvol==GF_BOUNDS_AABB)) { glDisable(GL_LIGHTING); VS3D_DrawAABBNodeBounds(eff, mesh->aabb_root); } else { gf_vec_diff(s, mesh->bounds.max_edge, mesh->bounds.min_edge); c.x = mesh->bounds.min_edge.x + s.x/2; c.y = mesh->bounds.min_edge.y + s.y/2; c.z = mesh->bounds.min_edge.z + s.z/2; glPushMatrix(); #ifdef GPAC_USE_OGL_ES glTranslatex(c.x, c.y, c.z); glScalex(s.x, s.y, s.z);#else glTranslatef(FIX2FLT(c.x), FIX2FLT(c.y), FIX2FLT(c.z)); glScalef(FIX2FLT(s.x), FIX2FLT(s.y), FIX2FLT(s.z));#endif VS3D_DrawMeshIntern(eff, eff->surface->render->unit_bbox); glPopMatrix(); }#ifdef GPAC_USE_OGL_ES ogles_pop_enable(atts);#else glPopAttrib();#endif}void VS3D_DrawMesh(RenderEffect3D *eff, GF_Mesh *mesh){ Bool mesh_drawn = 0; if (eff->surface->render->wiremode != GF_WIREFRAME_ONLY) { VS3D_DrawMeshIntern(eff, mesh); mesh_drawn = 1; } if (eff->surface->render->draw_normals) VS3D_DrawNormals(eff, mesh); if (!mesh->mesh_type && (eff->surface->render->wiremode != GF_WIREFRAME_NONE)) { glDisable(GL_LIGHTING); if (mesh_drawn) glColor4f(0, 0, 0, 1.0f); glEnableClientState(GL_VERTEX_ARRAY);#ifdef GPAC_USE_OGL_ES glVertexPointer(3, GL_FIXED, sizeof(GF_Vertex), &mesh->vertices[0].pos); glDrawElements(GL_LINES, mesh->i_count, GL_UNSIGNED_SHORT, mesh->indices);#else glVertexPointer(3, GL_FLOAT, sizeof(GF_Vertex), &mesh->vertices[0].pos); glDrawElements(GL_LINES, mesh->i_count, GL_UNSIGNED_INT, mesh->indices);#endif glDisableClientState(GL_VERTEX_ARRAY); } if (eff->surface->render->compositor->draw_bvol) VS3D_DrawMeshBoundingVolume(eff, mesh);}#ifndef GPAC_USE_OGL_ESstatic GLubyte hatch_horiz[] = { 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff};static GLubyte hatch_vert[] = { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa};static GLubyte hatch_up[] = { 0xc0, 0xc0, 0xc0, 0xc0, 0x30, 0x30, 0x30, 0x30, 0x0c, 0x0c, 0x0c, 0x0c, 0x03, 0x03, 0x03, 0x03, 0xc0, 0xc0, 0xc0, 0xc0, 0x30, 0x30, 0x30, 0x30, 0x0c, 0x0c, 0x0c, 0x0c, 0x03, 0x03, 0x03, 0x03, 0xc0, 0xc0, 0xc0, 0xc0, 0x30, 0x30, 0x30, 0x30, 0x0c, 0x0c, 0x0c, 0x0c, 0x03, 0x03, 0x03, 0x03, 0xc0, 0xc0, 0xc0, 0xc0, 0x30, 0x30, 0x30, 0x30, 0x0c, 0x0c, 0x0c, 0x0c, 0x03, 0x03, 0x03, 0x03, 0xc0, 0xc0, 0xc0, 0xc0, 0x30, 0x30, 0x30, 0x30, 0x0c, 0x0c, 0x0c, 0x0c, 0x03, 0x03, 0x03, 0x03, 0xc0, 0xc0, 0xc0, 0xc0, 0x30, 0x30, 0x30, 0x30, 0x0c, 0x0c, 0x0c, 0x0c, 0x03, 0x03, 0x03, 0x03, 0xc0, 0xc0, 0xc0, 0xc0, 0x30, 0x30, 0x30, 0x30, 0x0c, 0x0c, 0x0c, 0x0c, 0x03, 0x03, 0x03, 0x03, 0xc0, 0xc0, 0xc0, 0xc0, 0x30, 0x30, 0x30, 0x30, 0x0c, 0x0c, 0x0c, 0x0c, 0x03, 0x03, 0x03, 0x03};static GLubyte hatch_down[] = { 0x03, 0x03, 0x03, 0x03, 0x0c, 0x0c, 0x0c, 0x0c, 0x30, 0x30, 0x30, 0x30, 0xc0, 0xc0, 0xc0, 0xc0, 0x03, 0x03, 0x03, 0x03, 0x0c, 0x0c, 0x0c, 0x0c, 0x30, 0x30, 0x30, 0x30, 0xc0, 0xc0, 0xc0, 0xc0, 0x03, 0x03, 0x03, 0x03, 0x0c, 0x0c, 0x0c, 0x0c, 0x30, 0x30, 0x30, 0x30, 0xc0, 0xc0, 0xc0, 0xc0, 0x03, 0x03, 0x03, 0x03, 0x0c, 0x0c, 0x0c, 0x0c, 0x30, 0x30, 0x30, 0x30, 0xc0, 0xc0, 0xc0, 0xc0, 0x03, 0x03, 0x03, 0x03, 0x0c, 0x0c, 0x0c, 0x0c, 0x30, 0x30, 0x30, 0x30, 0xc0, 0xc0, 0xc0, 0xc0, 0x03, 0x03, 0x03, 0x03, 0x0c, 0x0c, 0x0c, 0x0c, 0x30, 0x30, 0x30, 0x30, 0xc0, 0xc0, 0xc0, 0xc0, 0x03, 0x03, 0x03, 0x03, 0x0c, 0x0c, 0x0c, 0x0c, 0x30, 0x30, 0x30, 0x30, 0xc0, 0xc0, 0xc0, 0xc0, 0x03, 0x03, 0x03, 0x03, 0x0c, 0x0c, 0x0c, 0x0c, 0x30, 0x30, 0x30, 0x30, 0xc0, 0xc0, 0xc0, 0xc0};static GLubyte hatch_cross[] = { 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c};void VS3D_HatchMesh(RenderEffect3D *eff, GF_Mesh *mesh, u32 hatchStyle, SFColor hatchColor){ if (mesh->mesh_type) return; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, sizeof(GF_Vertex), &mesh->vertices[0].pos); if (mesh->mesh_type || (mesh->flags & MESH_IS_2D)) { glDisableClientState(GL_NORMAL_ARRAY); if (mesh->mesh_type) glDisable(GL_LIGHTING); glNormal3f(0, 0, 1.0f); glDisable(GL_CULL_FACE); } else { glEnableClientState(GL_NORMAL_ARRAY ); glNormalPointer(GL_FLOAT, sizeof(GF_Vertex), &mesh->vertices[0].normal); if (!mesh->mesh_type) { /*if mesh is transparent DON'T CULL*/ if (!eff->mesh_is_transparent && (mesh->flags & MESH_IS_SOLID)) { glEnable(GL_CULL_FACE); glFrontFace((mesh->flags & MESH_IS_CW) ? GL_CW : GL_CCW); } else { glDisable(GL_CULL_FACE); } } } glEnable(GL_POLYGON_STIPPLE); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); /*can't access ISO International Register of Graphical Items www site :)*/ switch (hatchStyle) { case 5: glPolygonStipple(hatch_cross); break; case 4: glPolygonStipple(hatch_up); break; case 3: glPolygonStipple(hatch_down); break; case 2: glPolygonStipple(hatch_vert); break; case 1: glPolygonStipple(hatch_horiz); break; default: glDisable(GL_POLYGON_STIPPLE); break; } glColor3f(FIX2FLT(hatchColor.red), FIX2FLT(hatchColor.green), FIX2FLT(hatchColor.blue)); glDrawElements(GL_TRIANGLES, mesh->i_count, GL_UNSIGNED_INT, mesh->indices); glDisable(GL_POLYGON_STIPPLE);}#endif/*only used for ILS/ILS2D or IFS2D outline*/void VS3D_StrikeMesh(RenderEffect3D *eff, GF_Mesh *mesh, Fixed width, u32 dash_style){#ifndef GPAC_USE_OGL_ES u16 style;#endif if (mesh->mesh_type != MESH_LINESET) return; width/=2; glLineWidth( FIX2FLT(width));#ifndef GPAC_USE_OGL_ES switch (dash_style) { case GF_DASH_STYLE_DASH: style = 0x1F1F; break; case GF_DASH_STYLE_DOT: style = 0x3333; break; case GF_DASH_STYLE_DASH_DOT: style = 0x6767; break; case GF_DASH_STYLE_DASH_DASH_DOT: style = 0x33CF; break; case GF_DASH_STYLE_DASH_DOT_DOT: style = 0x330F; break; default: style = 0; break; } if (style) { u32 factor = FIX2INT(width); if (!factor) factor = 1; glEnable(GL_LINE_STIPPLE); glLineStipple(factor, style); VS3D_DrawMesh(eff, mesh); glDisable (GL_LINE_STIPPLE); } else #endif VS3D_DrawMesh(eff, mesh);}void VS3D_SetMaterial2D(VisualSurface *surf, SFColor col, Fixed alpha){ glDisable(GL_LIGHTING); if (alpha != FIX_ONE) { glEnable(GL_BLEND); VS3D_SetAntiAlias(surf, 0); } else { glDisable(GL_BLEND); VS3D_SetAntiAlias(surf, surf->render->compositor->antiAlias ? 1 : 0); }#ifdef GPAC_USE_OGL_ES glColor4x(col.red, col.green, col.blue, alpha);#else glColor4f(FIX2FLT(col.red), FIX2FLT(col.green), FIX2FLT(col.blue), FIX2FLT(alpha));#endif}void VS3D_SetAntiAlias(VisualSurface *surf, Bool bOn){ if (bOn) { glEnable(GL_LINE_SMOOTH); glEnable(GL_POINT_SMOOTH);#ifndef GPAC_USE_OGL_ES if (surf->render->poly_aa) glEnable(GL_POLYGON_SMOOTH); else glDisable(GL_POLYGON_SMOOTH);#endif } else { glDisable(GL_LINE_SMOOTH); glDisable(GL_POINT_SMOOTH);#ifndef GPAC_USE_OGL_ES glDisable(GL_POLYGON_SMOOTH);#endif }}void VS3D_ClearSurface(VisualSurface *surf, SFColor color, Fixed alpha){ glClearColor(FIX2FLT(color.red), FIX2FLT(color.green), FIX2FLT(color.blue), FIX2FLT(alpha)); glClear(GL_COLOR_BUFFER_BIT);}#ifndef GPAC_USE_OGL_ESvoid VS3D_DrawImage(VisualSurface *surf, Fixed pos_x, Fixed pos_y, u32 width, u32 height, u32 pixelformat, char *data, Fixed scale_x, Fixed scale_y){ u32 gl_format; glPixelZoom(FIX2FLT(scale_x), FIX2FLT(scale_y)); gl_format = 0; switch (pixelformat) { case GF_PIXEL_RGB_24: gl_format = GL_RGB; break; case GF_PIXEL_RGB_32: case GF_PIXEL_RGBA: gl_format = GL_RGBA; break; case GF_PIXEL_ARGB: if (!surf->render->hw_caps.bgra_texture) return; gl_format = GL_BGRA_EXT; break; default: return; } /*glRasterPos2f doesn't accept point outside the view volume (it invalidates all draw pixel, draw bitmap) so we move to the center of the local coord system, draw a NULL bitmap with raster pos displacement*/ glRasterPos2f(0, 0); glBitmap(0, 0, 0, 0, FIX2FLT(pos_x), -FIX2FLT(pos_y), NULL); glDrawPixels(width, height, gl_format, GL_UNSIGNED_BYTE, data); glBitmap(0, 0, 0, 0, -FIX2FLT(pos_x), FIX2FLT(pos_y), NULL);}void VS3D_GetMatrix(VisualSurface *surf, u32 mat_type, Fixed *mat){#ifdef GPAC_FIXED_POINT u32 i = 0;#endif Float _mat[16]; switch (mat_type) { case MAT_MODELVIEW: glGetFloatv(GL_MODELVIEW_MATRIX, _mat); break; case MAT_PROJECTION: glGetFloatv(GL_PROJECTION_MATRIX, _mat); break; case MAT_TEXTURE: glGetFloatv(GL_TEXTURE_MATRIX, _mat); break; }#ifdef GPAC_FIXED_POINT for (i=0; i<16; i++) mat[i] = FLT2FIX(_mat[i]);#else memcpy(mat, _mat, sizeof(Fixed)*16);#endif}#endifvoid VS3D_SetMatrixMode(VisualSurface *surf, u32 mat_type){ switch (mat_type) { case MAT_MODELVIEW: glMatrixMode(GL_MODELVIEW); break; case MAT_PROJECTION: glMatrixMode(GL_PROJECTION); break; case MAT_TEXTURE: glMatrixMode(GL_TEXTURE); break; }}void VS3D_ResetMatrix(VisualSurface *surf)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -