@@ -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 >