⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vs_gl_draw.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 3 页
字号:
		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 + -