Large diffs are not rendered by default.

@@ -179,6 +179,7 @@ <h2>Team Members</h2>
uniform int numTriangle;
uniform vec3 bgdColor;
uniform vec3 light;
uniform vec3 intensity;

// GET RAY DIRECTION
vec3 getDir() {
@@ -194,7 +195,6 @@ <h2>Team Members</h2>
vec3 d = normalize(z + y + x);
return d;
}

// GET THE T VALUE (eye + t * d)
float getT(vec3 v1, vec3 v2, vec3 v3) {
vec3 n = normalize(cross(v1 - v2, v3 - v2));
@@ -203,7 +203,6 @@ <h2>Team Members</h2>
float t = num / den;
return t;
}

// GET THE INTERSECTION POINT
vec3 intersection(vec3 v1, vec3 v2, vec3 v3) {
float t = getT(v1, v2, v3);
@@ -212,22 +211,35 @@ <h2>Team Members</h2>
vec3 intersection = eye + td;
return intersection;
}

// CHECK IF THE INTERSECTION POINT IS IN THE TRIANGLE (IF YES, GENERATE BARYCENTRIC
// COORDS THEN RETURN TRUE, IF NOT JUST RETURN FALSE)
// CHECK IF THE INTERSECTION POINT IS IN THE TRIANGLE
bool ifIntersected(vec3 v1, vec3 v2, vec3 v3, vec3 p, out vec3 bary) {
float faceArea = length(cross(v1 - v2, v3 - v2));
float au = length(cross(v1 - p, v2 - p));
float aw = length(cross(v1 - p, v3 - p));
float av = length(cross(v2 - p, v3 - p));
if (abs(au + aw + av - faceArea) > 0.0001) return false;

if (abs(au + aw + av - faceArea) > 0.001) return false;
bary.x = au / faceArea;
bary.y = aw / faceArea;
bary.z = av / faceArea;
return true;
}

bool ifInBetween(vec3 surf){
float t = length(surf - eye);
for (int i=0; i < MAX_TRIANGLE; i++){
if (i >= numTriangle) break;
vec3 a1 = vertPosition[3 * i];
vec3 a2 = vertPosition[3 * i + 1];
vec3 a3 = vertPosition[3 * i + 2];
vec3 p = intersection(a1, a2, a3);
vec3 bary = vec3(0.0, 0.0, 0.0);
if (ifIntersected(a1, a2, a3, p, bary)){
if (length(p - eye) < t) return true;
}
}
return false;
}

vec4 minT(vec3 v1, vec3 v2, vec3 v3, vec3 color, int currPos) {
vec4 colorT = vec4(color, currPos);
float mint = getT(v1, v2, v3);
@@ -254,107 +266,79 @@ <h2>Team Members</h2>
}
}
}

return colorT;
}

// GET DIRECTION FROM MESH INTERSECTION TO LIGHT
vec3 getOppoDir(vec3 p){
vec3 getOppoDir(vec3 p) {
return normalize(light - p);
}

// OFFSET THE START POINT OF THE RAY BACK TO THE LIGHT
#define EPSILON 0.01
vec3 offSet(vec3 p, vec3 dir){
vec3 p_new = vec3(p.x + EPSILON * dir.x, p.y + EPSILON * dir.y, p.z + EPSILON * dir.z);
return p_new;
}

// COMPUTE THE T TO LIGHT FROM MESH INTERSECTION
float getOppoT(vec3 v1, vec3 v2, vec3 v3, vec3 p) {
float getOppoT(vec3 v1, vec3 v2, vec3 v3, vec3 p) {// p = surface
vec3 n = cross(v1 - v2, v3 - v2);
float num = dot(v2 - p, n);
float den = dot(getOppoDir(p), n);
float t = num / den;
return t;
}

float getToLightDis(vec3 p){
float getToLightDis(vec3 p) { //p = surface
return length(light - p);
}

// COMPUTE THE INTERSECTION (RAY FROM )
vec3 toLightIntersection (vec3 v1, vec3 v2, vec3 v3, vec3 p) { // surface
// COMPUTE THE INTERSECTION
vec3 toLightIntersection (vec3 v1, vec3 v2, vec3 v3, vec3 p) { // p = surface
float t = getOppoT(v1, v2, v3, p);
vec3 dir = getOppoDir(p);
vec3 td = vec3(dir.x * t, dir.y * t, dir.z * t);
vec3 intersection = p + td;
return intersection;
}

bool ifToLightIntersect(vec3 v1, vec3 v2, vec3 v3, vec3 p, vec3 surf){ // mesh
bool ifToLightIntersect(vec3 v1, vec3 v2, vec3 v3, vec3 p, vec3 surf) { // p = mesh between light and surf
float t = getOppoT(v1, v2, v3, surf);

if (t > getToLightDis(surf)) return false;

if (t < 0.0) return false;
if (t < EPSILON) return false;
if (t - getToLightDis(surf) >= 0.001) return false;

float faceArea = length(cross(v1 - v2, v3 - v2));
float au = length(cross(v1 - p, v2 - p));
float aw = length(cross(v1 - p, v3 - p));
float av = length(cross(v2 - p, v3 - p));
if (abs(au + aw + av - faceArea) > 0.0001) return false;
if (abs(au + aw + av - faceArea) > 0.001) return false;
return true;
}

vec3 triangleIntersect(vec3 v1, vec3 v2, vec3 v3, vec3 bary){
vec3 p1 = vec3(v1.x * bary.z, v1.y * bary.z, v1.z * bary.z);
vec3 p2 = vec3(v2.x * bary.y, v2.y * bary.y, v2.z * bary.y);
vec3 p3 = vec3(v3.x * bary.x, v3.y * bary.x, v3.z * bary.x);
vec3 p = p1 + p2 + p3;
vec3 dir = getOppoDir(p);
return offSet(p, dir);
}

bool isShadowed(vec3 surfacePoint){
for (int i=0; i < MAX_TRIANGLE; i++){
bool isShadowed(vec3 surfacePoint) {
for (int i=0; i < MAX_TRIANGLE; i++) {
if (i >= numTriangle) break;

vec3 a1 = vertPosition[3 * i];
vec3 a2 = vertPosition[3 * i + 1];
vec3 a3 = vertPosition[3 * i + 2];

vec3 p = toLightIntersection(a1, a2, a3, surfacePoint);

if (ifToLightIntersect(a1, a2, a3, p, surfacePoint)) {
return true;
}

}
return false;
}

vec3 computeNormal(float pos){
vec3 computeNormal(float pos) {
vec3 result;
for (int i=0; i < MAX_TRIANGLE; i++){
for (int i=0; i < MAX_TRIANGLE; i++) {
float temp_i = float(i);
if (abs(temp_i - pos) < 0.01){
if (abs(temp_i - pos) < 0.01) {
vec3 a1 = vertPosition[3 * i];
vec3 a2 = vertPosition[3 * i + 1];
vec3 a3 = vertPosition[3 * i + 2];

result = cross(a1 - a2, a3 - a2);
result = abs(normalize(result));
result = cross(a3 - a2, a1 - a2);
result = normalize(result);
break;
}
}
return result;
}

void main() {
gl_FragColor = vec4(bgdColor, 1.0);

if (renderMode == 1){ // FACE COLOR
if(renderMode == 1) { // FACE COLOR
for (int i=0; i<MAX_TRIANGLE; i++) {
if (i >= numTriangle)
break;
@@ -365,13 +349,13 @@ <h2>Team Members</h2>
vec3 c = vertColor[i];
vec3 bary = vec3(0,0,0);
vec4 colorPos;
if(ifIntersected(a1, a2, a3, p, bary)){

if(ifIntersected(a1, a2, a3, p, bary)) {
colorPos = minT(a1, a2, a3, c, i);
gl_FragColor = vec4(colorPos.x, colorPos.y, colorPos.z, 1.0);
}
}
}
else if (renderMode == 2){ // NORMAL
} else if(renderMode == 2) { // NORMAL
for (int i=0; i<MAX_TRIANGLE; i++) {
if (i >= numTriangle)
break;
@@ -381,20 +365,17 @@ <h2>Team Members</h2>
vec3 p = intersection(a1, a2, a3);
vec3 c = vertColor[i];
vec3 bary = vec3(0,0,0);

vec4 colorPos;
vec3 normal;

if(ifIntersected(a1, a2, a3, p, bary)){
if(ifIntersected(a1, a2, a3, p, bary)) {
colorPos = minT(a1, a2, a3, c, i);
normal = computeNormal(colorPos.w);
normal = normal + vec3(1.0, 1.0, 1.0);
normal = vec3(normal.x*0.5, normal.y*0.5, normal.z*0.5);
gl_FragColor = vec4(normal.x, normal.y, normal.z, 1.0);
}
}
}
else if (renderMode == 3){ // SHADOW MODE
} else if(renderMode == 3) { // SHADOW MODE
gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
for (int i=0; i<MAX_TRIANGLE; i++) {
if (i >= numTriangle)
@@ -404,16 +385,41 @@ <h2>Team Members</h2>
vec3 a3 = vertPosition[3 * i + 2];
vec3 bary = vec3(0, 0, 0);
vec3 p = intersection(a1, a2, a3);

if (ifIntersected(a1, a2, a3, p, bary)) {
vec3 surfPoint = triangleIntersect(a1, a2, a3, bary);
if (!isShadowed(surfPoint))
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
if(ifIntersected(a1, a2, a3, p, bary)) {
if(!ifInBetween(p)) {
if(!isShadowed(p)) {
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
}
}
}
}
else{ // FULL MODE
} else {
for (int i=0; i<MAX_TRIANGLE; i++) {
if (i >= numTriangle)
break;
vec3 a1 = vertPosition[3 * i];
vec3 a2 = vertPosition[3 * i + 1];
vec3 a3 = vertPosition[3 * i + 2];
vec3 p = intersection(a1, a2, a3);
vec3 c = vertColor[i];
vec3 bary = vec3(0,0,0);

if(ifIntersected(a1, a2, a3, p, bary)) {
if (!ifInBetween(p)){
if(!isShadowed(p)) {
vec3 n = computeNormal(float(i));
vec3 l = getOppoDir(p);
float r = length(light - p);
float d = dot(n, l);
if(d < 0.0) d = 0.0;

gl_FragColor.x = (c.x * intensity.x * d) / (r * r);
gl_FragColor.y = (c.y * intensity.y * d) / (r * r);
gl_FragColor.z = (c.z * intensity.z * d) / (r * r);
}
}
}
}
}
}
</script>
@@ -622,7 +628,6 @@ <h2>Team Members</h2>
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, indexBuffer);
gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, indexArray, gl.STATIC_DRAW);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);

function updateWebGL() {
gl.clearColor(0.0, 0.0, 0.0, 0.0);
gl.clear(gl.COLOR_BUFFER_BIT);
@@ -642,7 +647,6 @@ <h2>Team Members</h2>
gl.useProgram(null);
window.requestAnimationFrame(updateWebGL);
}

window.requestAnimationFrame(updateWebGL);
}

@@ -662,12 +666,14 @@ <h2>Team Members</h2>
var numTriangle = scene.numTriangles;
var bgdColor = getBackgroundColor();
var light = getLightPosition();
var intensity = getLightIntensity();
gl.uniform3fv(gl.getUniformLocation(program, "vertPosition"), pos);
gl.uniform3fv(gl.getUniformLocation(program, "vertColor"), color);
gl.uniform1i(gl.getUniformLocation(program, "numTriangle"), numTriangle);
gl.uniform3f(gl.getUniformLocation(program, "bgdColor"), bgdColor[0], bgdColor[1], bgdColor[2]);
gl.uniform1i(gl.getUniformLocation(program, "renderMode"), renderMode);
gl.uniform3f(gl.getUniformLocation(program, "light"), light[0], light[1], light[2]);
gl.uniform3f(gl.getUniformLocation(program, "intensity"), intensity[0], intensity[1], intensity[2]);
});
</script>
</body>

This file was deleted.