void QtDrawing3d::DrawPolygon(const bsp_node *tree, QPainter *painter) { if (!tree) return; polygon3d_node *pn; unsigned short n_pol = tree->polygons.count; son_point3d_t points[MAX_POINT_PER_POLY]; unsigned short i,j; son_point3d_t prjPnt[MAX_POINT_PER_POLY]; static int colorflag = 0; double shade; QPainterPath path; son_point3d_t mv; pn = (polygon3d_node *)head_node(&tree->polygons); for (j = 0; j < n_pol; j++) { polygon3d_get_points(&pn->polygon3d, points); matrix4_mult_vector(&m_modelViewMatrix, &points[0], &mv); proj_point_2_plane(&mv, &m_n, &m_p, &prjPnt[0]); path.moveTo(prjPnt[0].v[0], prjPnt[0].v[1]); for (i = 1; i < pn->polygon3d.n_ver; ++i) { matrix4_mult_vector(&m_modelViewMatrix, &points[i], &mv); proj_point_2_plane(&mv, &m_n, &m_p, &prjPnt[i]); path.lineTo(prjPnt[i].v[0], prjPnt[i].v[1]); } path.closeSubpath(); shade = ComputeLight(&pn->polygon3d); m_color = QColor(pn->polygon3d.color[0] * shade, pn->polygon3d.color[1] * shade, pn->polygon3d.color[2] * shade); painter->fillPath(path, QBrush(m_color)); pn = (polygon3d_node *)next_node(&tree->polygons, (node2 *)pn); } }
void main(void)\n\ {\n\ vec4 texColor = diffuseColor;\n\ vertexPosition = vec2( position ); \n\ bezierKLM = vec3( texCoord, texMO[0] ); \n\ pathOffset = texMO[1]; \n\ worldNormal = normal;\n\ relativeCameraPosition = normalize( cameraPosition - position );\n\ vertexColor = vec4( 0.0, 0.0, 0.0, 0.0 );\n\ if( textureCount > 0 || vectorGraphics > 0 ) texColor = vec4( 1.0, 1.0, 1.0, 1.0 );\n\ for(int i=0; i<lightCount; ++i){\n\ vec3 relativeLightSource2 = lightSource[i] - position;\n\ relativeLightSource2 = normalize( relativeLightSource2 );\n\ vertexColor += ComputeLight( relativeLightSource2, lightIntensity[i], texColor );\n\ relativeLightSource[i] = relativeLightSource2;\n\ }\n\ if( lightCount == 0 ) vertexColor = texColor;\n\ gl_Position = projMatrix * viewMatrix * vec4( position, 1.0 );\n\ texCoord2 = texCoord;\n\ }\n";
vec3 Trace(Ray rayinit) { Ray ray = rayinit; int recursiveDepth = 0; vec3 mycolor = vec3(0, 0, 0); vec3 specularity(1, 1, 1); while (recursiveDepth < 5) { float thit = INFINITY; LocalGeo local; vector<Shape*>::iterator iter = shape.begin(); bool intersection = false; while (iter != shape.end()) { if ((*iter)->intersect(ray, &thit, &local)) { intersection = true; } iter++; } if (intersection) { vector<Light*>::iterator light_iter = lights.begin(); Ray lray; mycolor += vec3(local.ambient[0], local.ambient[1], local.ambient[2]); mycolor += vec3(local.emission[0], local.emission[1], local.emission[2]); vec3 lcolor; while (light_iter != lights.end()) { (*light_iter)->generateLightRay(local, &lray, &lcolor); iter = shape.begin(); bool block = false; LocalGeo blockLocal; float blockThit = (*light_iter)->getDis(local); while (iter != shape.end()) { if ((*iter)->intersectPD(lray, blockThit)) { block = true; break; } iter++; } if (!block) { vec3 finalcolor; vec3 mypos = local.pos; vec3 eyedirn = normalize(ray.pos - mypos); vec3 normal = local.normal; vec3 direction = normalize(lray.dir); vec3 halfvec = normalize(direction + eyedirn); vec3 lightcolor = (*light_iter)->getLightcol(); vec3 diffuse = vec3(local.diffuse[0], local.diffuse[1], local.diffuse[2]); vec3 specular = vec3(local.specular[0], local.specular[1], local.specular[2]); float shininess = local.shininess; vec3 disvec = local.pos - lray.pos; float dis = sqrt(disvec.x * disvec.x + disvec.y * disvec.y + disvec.z * disvec.z); float atten = (*light_iter)->getAttenuation(dis, attenuation); finalcolor = ComputeLight(direction, lightcolor, normal, halfvec, diffuse, specular, shininess) * specularity * atten; mycolor += finalcolor; } light_iter++; } if ((local.specular[0] < 0.0001f && local.specular[1] < 0.0001f && local.specular[2] < 0.0001f)) { break; } specularity *= vec3(local.specular[0], local.specular[1], local.specular[2]); ray.dir = reflect(ray.dir, local.normal); ray.pos = local.pos; recursiveDepth++; } else { break; } } if (mycolor.x > 1) { mycolor.x = 1; } if (mycolor.y > 1) { mycolor.y = 1; } if (mycolor.z > 1) { mycolor.z = 1; } return mycolor; }