ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/hd/sm_geom.c
(Generate patch)

Comparing ray/src/hd/sm_geom.c (file contents):
Revision 3.5 by gwlarson, Mon Sep 14 10:33:46 1998 UTC vs.
Revision 3.6 by gwlarson, Wed Sep 16 18:16:28 1998 UTC

# Line 736 | Line 736 | FVECT fnear[4],ffar[4];
736      ffar[3][2] =  width*nhv[2] - height*nvv[2] + far*ndv[2] + vp[2] ;
737   }
738  
739 + int
740 + max_index(v,r)
741 + FVECT v;
742 + double *r;
743 + {
744 +  double p[3];
745 +  int i;
746  
747 +  p[0] = fabs(v[0]);
748 +  p[1] = fabs(v[1]);
749 +  p[2] = fabs(v[2]);
750 +  i = (p[0]>=p[1])?((p[0]>=p[2])?0:2):((p[1]>=p[2])?1:2);  
751 +  if(r)
752 +    *r = p[i];
753 +  return(i);
754 + }
755  
756 + int
757 + closest_point_in_tri(p0,p1,p2,p,p0id,p1id,p2id)
758 + FVECT p0,p1,p2,p;
759 + int p0id,p1id,p2id;
760 + {
761 +    double d,d1;
762 +    int i;
763 +    
764 +    d =  DIST_SQ(p,p0);
765 +    d1 = DIST_SQ(p,p1);
766 +    if(d < d1)
767 +    {
768 +      d1 = DIST_SQ(p,p2);
769 +      i = (d1 < d)?p2id:p0id;
770 +    }
771 +    else
772 +    {
773 +      d = DIST_SQ(p,p2);
774 +      i = (d < d1)? p2id:p1id;
775 +    }
776 +    return(i);
777 + }
778  
779 +
780   int
781   sedge_intersect(a0,a1,b0,b1)
782   FVECT a0,a1,b0,b1;
# Line 800 | Line 838 | double coord[3];
838    a =  (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1);
839    coord[0] = ((x2 - px) * (y3 - py) - (x3 - px) * (y2 - py)) / a;
840    coord[1] = ((x3 - px) * (y1 - py) - (x1 - px) * (y3 - py)) / a;
841 <  coord[2]  = 1.0 - coord[0] - coord[1];
841 >  coord[2] = ((x1 - px) * (y2 - py) - (x2 - px) * (y1 - py)) / a;
842  
843   }
844  
# Line 1013 | Line 1051 | int child,next;
1051    }
1052   }
1053  
1054 < int
1055 < max_index(v)
1056 < FVECT v;
1054 >
1055 > baryi_parent(coord,i)
1056 > BCOORD coord[3];
1057 > int i;
1058   {
1020  double a,b,c;
1021  int i;
1059  
1060 <  a = fabs(v[0]);
1061 <  b = fabs(v[1]);
1062 <  c = fabs(v[2]);
1063 <  i = (a>=b)?((a>=c)?0:2):((b>=c)?1:2);  
1064 <  return(i);
1060 >  switch(i) {
1061 >  case 0:
1062 >    /* update bary for child */
1063 >    coord[0] = (coord[0] >> 1) + MAXBCOORD2;
1064 >    coord[1] >>= 1;
1065 >    coord[2] >>= 1;
1066 >    break;
1067 >  case 1:
1068 >    coord[0] >>= 1;
1069 >    coord[1]  = (coord[1] >> 1) + MAXBCOORD2;
1070 >    coord[2] >>= 1;
1071 >    break;
1072 >    
1073 >  case 2:
1074 >    coord[0] >>= 1;
1075 >    coord[1] >>= 1;
1076 >    coord[2] = (coord[2] >> 1) + MAXBCOORD2;
1077 >    break;
1078 >    
1079 >  case 3:
1080 >    coord[0] = MAXBCOORD2 - (coord[0] >> 1);
1081 >    coord[1] = MAXBCOORD2 - (coord[1] >> 1);
1082 >    coord[2] = MAXBCOORD2 - (coord[2] >> 1);
1083 >    break;
1084 > #ifdef DEBUG
1085 >  default:
1086 >    eputs("baryi_parent():Invalid child\n");
1087 >    break;
1088 > #endif
1089 >  }
1090   }
1091  
1092 + baryi_from_child(coord,child,next)
1093 + BCOORD coord[3];
1094 + int child,next;
1095 + {
1096 + #ifdef DEBUG
1097 +  if(child <0 || child > 3)
1098 +  {
1099 +    eputs("baryi_from_child():Invalid child\n");
1100 +    return;
1101 +  }
1102 +  if(next <0 || next > 3)
1103 +  {
1104 +    eputs("baryi_from_child():Invalid next\n");
1105 +    return;
1106 +  }
1107 + #endif
1108 +  if(next == child)
1109 +    return;
1110 +
1111 +  switch(child){
1112 +  case 0:
1113 +      coord[0] = 0;
1114 +      coord[1] = MAXBCOORD - coord[1];
1115 +      coord[2] = MAXBCOORD - coord[2];
1116 +      break;
1117 +  case 1:
1118 +      coord[0] = MAXBCOORD - coord[0];
1119 +      coord[1] = 0;
1120 +      coord[2] = MAXBCOORD - coord[2];
1121 +      break;
1122 +  case 2:
1123 +      coord[0] = MAXBCOORD - coord[0];
1124 +      coord[1] = MAXBCOORD - coord[1];
1125 +      coord[2] = 0;
1126 +    break;
1127 +  case 3:
1128 +    switch(next){
1129 +    case 0:
1130 +      coord[0] = 0;
1131 +      coord[1] = MAXBCOORD - coord[1];
1132 +      coord[2] = MAXBCOORD - coord[2];
1133 +      break;
1134 +    case 1:
1135 +      coord[0] = MAXBCOORD - coord[0];
1136 +      coord[1] = 0;
1137 +      coord[2] = MAXBCOORD - coord[2];
1138 +      break;
1139 +    case 2:
1140 +      coord[0] = MAXBCOORD - coord[0];
1141 +      coord[1] = MAXBCOORD - coord[1];
1142 +      coord[2] = 0;
1143 +      break;
1144 +    }
1145 +    break;
1146 +  }
1147 + }
1148 +
1149   int
1150 < closest_point_in_tri(p0,p1,p2,p,p0id,p1id,p2id)
1151 < FVECT p0,p1,p2,p;
1033 < int p0id,p1id,p2id;
1150 > baryi_child(coord)
1151 > BCOORD coord[3];
1152   {
1153 <    double d,d1;
1154 <    int i;
1155 <    
1156 <    d =  DIST_SQ(p,p0);
1157 <    d1 = DIST_SQ(p,p1);
1158 <    if(d < d1)
1153 >  int i;
1154 >
1155 >  if(coord[0] > MAXBCOORD2)
1156 >  {
1157 >      /* update bary for child */
1158 >      coord[0] = (coord[0]<< 1) - MAXBCOORD;
1159 >      coord[1] <<= 1;
1160 >      coord[2] <<= 1;
1161 >      return(0);
1162 >  }
1163 >  else
1164 >    if(coord[1] > MAXBCOORD2)
1165      {
1166 <      d1 = DIST_SQ(p,p2);
1167 <      i = (d1 < d)?p2id:p0id;
1166 >      coord[0] <<= 1;
1167 >      coord[1] = (coord[1] << 1) - MAXBCOORD;
1168 >      coord[2] <<= 1;
1169 >      return(1);
1170      }
1171      else
1172 +      if(coord[2] > MAXBCOORD2)
1173 +      {
1174 +        coord[0] <<= 1;
1175 +        coord[1] <<= 1;
1176 +        coord[2] = (coord[2] << 1) - MAXBCOORD;
1177 +        return(2);
1178 +      }
1179 +      else
1180 +         {
1181 +           coord[0] = MAXBCOORD - (coord[0] << 1);
1182 +           coord[1] = MAXBCOORD - (coord[1] << 1);
1183 +           coord[2] = MAXBCOORD - (coord[2] << 1);
1184 +           return(3);
1185 +         }
1186 + }
1187 +
1188 + /* convert barycentric coordinate b in [-eps,1+eps] to [0,MAXLONG],
1189 +   dir unbounded to [-MAXLONG,MAXLONG]
1190 + */
1191 + bary_dtol(b,db,bi,dbi,t)
1192 + double b[3],db[3][3];
1193 + BCOORD bi[3];
1194 + BDIR dbi[3][3];
1195 + TINT t[3];
1196 + {
1197 +  int i,id,j;
1198 +  double d;
1199 +
1200 +  for(i=0; i < 2;i++)
1201 +  {
1202 +    if(b[i] <= 0.0)
1203      {
1204 <      d = DIST_SQ(p,p2);
1048 <      i = (d < d1)? p2id:p1id;
1204 >      bi[i]= 0;
1205      }
1206 <    return(i);
1206 >    else
1207 >      if(b[i] >= 1.0)
1208 >      {
1209 >        bi[i]= MAXBCOORD;
1210 >      }
1211 >      else
1212 >        bi[i] = (BCOORD)(b[i]*MAXBCOORD);
1213 >  }
1214 >  bi[2] = MAXBCOORD - bi[0] - bi[1];
1215 >
1216 >  if(bi[2] < 0)
1217 >  {
1218 >      bi[2] = 0;
1219 >      bi[1] = MAXBCOORD - bi[0];
1220 >  }
1221 >  for(j=0; j< 3; j++)
1222 >  {
1223 >    if(t[j]==0)
1224 >      continue;
1225 >    if(t[j] == HUGET)
1226 >       max_index(db[j],&d);
1227 >    for(i=0; i< 3; i++)
1228 >       if(t[j] != HUGET)
1229 >          dbi[j][i] = (BDIR)(db[j][i]*MAXBDIR);
1230 >       else
1231 >          dbi[j][i] = (BDIR)(db[j][i]/d*MAXBDIR);
1232 >  }
1233   }
1234 +
1235 +
1236  
1237  
1238  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines