Example #1
0
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";
Example #3
0
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;
}