927{
928 double uins;
929 double dx1, dy1, dz1, dw1;
930 double dx2, dy2, dz2, dw2;
931 double dx3, dy3, dz3, dw3;
932 double dx4, dy4, dz4, dw4;
933 double dx5, dy5, dz5, dw5;
934 double dx6, dy6, dz6, dw6;
935 double dx7, dy7, dz7, dw7;
936 double dx8, dy8, dz8, dw8;
937 double dx9, dy9, dz9, dw9;
938 double dx10, dy10, dz10, dw10;
939 double attn0, attn1, attn2, attn3, attn4;
940 double attn5, attn6, attn7, attn8, attn9, attn10;
941 double attn_ext0, attn_ext1, attn_ext2;
942 int8_t c, c1, c2;
943 int8_t aPoint, bPoint;
944 double aScore, bScore;
945 int aIsBiggerSide;
946 int bIsBiggerSide;
948 double score;
949
950
952 double xs =
x + stretchOffset;
953 double ys =
y + stretchOffset;
954 double zs = z + stretchOffset;
955 double ws =
w + stretchOffset;
956
957
962
963
965 double xb = xsb + squishOffset;
966 double yb = ysb + squishOffset;
967 double zb = zsb + squishOffset;
968 double wb = wsb + squishOffset;
969
970
971 double xins = xs - xsb;
972 double yins = ys - ysb;
973 double zins = zs - zsb;
974 double wins = ws - wsb;
975
976
977 double inSum = xins + yins + zins + wins;
978
979
982 double dz0 = z - zb;
984
985
986 double dx_ext0, dy_ext0, dz_ext0, dw_ext0;
987 double dx_ext1, dy_ext1, dz_ext1, dw_ext1;
988 double dx_ext2, dy_ext2, dz_ext2, dw_ext2;
989 int xsv_ext0, ysv_ext0, zsv_ext0, wsv_ext0;
990 int xsv_ext1, ysv_ext1, zsv_ext1, wsv_ext1;
991 int xsv_ext2, ysv_ext2, zsv_ext2, wsv_ext2;
992
994 if (inSum <= 1) {
995
996
997 aPoint = 0x01;
998 aScore = xins;
999 bPoint = 0x02;
1000 bScore = yins;
1001 if (aScore >= bScore && zins > bScore) {
1002 bScore = zins;
1003 bPoint = 0x04;
1004 } else if (aScore < bScore && zins > aScore) {
1005 aScore = zins;
1006 aPoint = 0x04;
1007 }
1008 if (aScore >= bScore && wins > bScore) {
1009 bScore = wins;
1010 bPoint = 0x08;
1011 } else if (aScore < bScore && wins > aScore) {
1012 aScore = wins;
1013 aPoint = 0x08;
1014 }
1015
1016
1017
1018 uins = 1 - inSum;
1019 if (uins > aScore || uins > bScore) {
1020 c = (bScore > aScore ? bPoint : aPoint);
1021 if ((c & 0x01) == 0) {
1022 xsv_ext0 = xsb - 1;
1023 xsv_ext1 = xsv_ext2 = xsb;
1024 dx_ext0 = dx0 + 1;
1025 dx_ext1 = dx_ext2 = dx0;
1026 } else {
1027 xsv_ext0 = xsv_ext1 = xsv_ext2 = xsb + 1;
1028 dx_ext0 = dx_ext1 = dx_ext2 = dx0 - 1;
1029 }
1030
1031 if ((c & 0x02) == 0) {
1032 ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb;
1033 dy_ext0 = dy_ext1 = dy_ext2 = dy0;
1034 if ((c & 0x01) == 0x01) {
1035 ysv_ext0 -= 1;
1036 dy_ext0 += 1;
1037 } else {
1038 ysv_ext1 -= 1;
1039 dy_ext1 += 1;
1040 }
1041 } else {
1042 ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb + 1;
1043 dy_ext0 = dy_ext1 = dy_ext2 = dy0 - 1;
1044 }
1045
1046 if ((c & 0x04) == 0) {
1047 zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb;
1048 dz_ext0 = dz_ext1 = dz_ext2 = dz0;
1049 if ((c & 0x03) != 0) {
1050 if ((c & 0x03) == 0x03) {
1051 zsv_ext0 -= 1;
1052 dz_ext0 += 1;
1053 } else {
1054 zsv_ext1 -= 1;
1055 dz_ext1 += 1;
1056 }
1057 } else {
1058 zsv_ext2 -= 1;
1059 dz_ext2 += 1;
1060 }
1061 } else {
1062 zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb + 1;
1063 dz_ext0 = dz_ext1 = dz_ext2 = dz0 - 1;
1064 }
1065
1066 if ((c & 0x08) == 0) {
1067 wsv_ext0 = wsv_ext1 = wsb;
1068 wsv_ext2 = wsb - 1;
1069 dw_ext0 = dw_ext1 = dw0;
1070 dw_ext2 = dw0 + 1;
1071 } else {
1072 wsv_ext0 = wsv_ext1 = wsv_ext2 = wsb + 1;
1073 dw_ext0 = dw_ext1 = dw_ext2 = dw0 - 1;
1074 }
1075 } else {
1076 c = (int8_t)(aPoint | bPoint);
1077
1078 if ((c & 0x01) == 0) {
1079 xsv_ext0 = xsv_ext2 = xsb;
1080 xsv_ext1 = xsb - 1;
1084 } else {
1085 xsv_ext0 = xsv_ext1 = xsv_ext2 = xsb + 1;
1088 }
1089
1090 if ((c & 0x02) == 0) {
1091 ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb;
1094 if ((c & 0x01) == 0x01) {
1095 ysv_ext1 -= 1;
1096 dy_ext1 += 1;
1097 } else {
1098 ysv_ext2 -= 1;
1099 dy_ext2 += 1;
1100 }
1101 } else {
1102 ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb + 1;
1105 }
1106
1107 if ((c & 0x04) == 0) {
1108 zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb;
1111 if ((c & 0x03) == 0x03) {
1112 zsv_ext1 -= 1;
1113 dz_ext1 += 1;
1114 } else {
1115 zsv_ext2 -= 1;
1116 dz_ext2 += 1;
1117 }
1118 } else {
1119 zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb + 1;
1122 }
1123
1124 if ((c & 0x08) == 0) {
1125 wsv_ext0 = wsv_ext1 = wsb;
1126 wsv_ext2 = wsb - 1;
1130 } else {
1131 wsv_ext0 = wsv_ext1 = wsv_ext2 = wsb + 1;
1134 }
1135 }
1136
1137
1138 attn0 = 2 - dx0 * dx0 - dy0 * dy0 - dz0 * dz0 - dw0 * dw0;
1139 if (attn0 > 0) {
1140 attn0 *= attn0;
1141 value += attn0 * attn0 *
extrapolate4(ctx, xsb + 0, ysb + 0, zsb + 0, wsb + 0, dx0, dy0, dz0, dw0);
1142 }
1143
1144
1149 attn1 = 2 - dx1 * dx1 - dy1 * dy1 - dz1 * dz1 - dw1 * dw1;
1150 if (attn1 > 0) {
1151 attn1 *= attn1;
1152 value += attn1 * attn1 *
extrapolate4(ctx, xsb + 1, ysb + 0, zsb + 0, wsb + 0, dx1, dy1, dz1, dw1);
1153 }
1154
1155
1158 dz2 = dz1;
1159 dw2 = dw1;
1160 attn2 = 2 - dx2 * dx2 - dy2 * dy2 - dz2 * dz2 - dw2 * dw2;
1161 if (attn2 > 0) {
1162 attn2 *= attn2;
1163 value += attn2 * attn2 *
extrapolate4(ctx, xsb + 0, ysb + 1, zsb + 0, wsb + 0, dx2, dy2, dz2, dw2);
1164 }
1165
1166
1167 dx3 = dx2;
1168 dy3 = dy1;
1170 dw3 = dw1;
1171 attn3 = 2 - dx3 * dx3 - dy3 * dy3 - dz3 * dz3 - dw3 * dw3;
1172 if (attn3 > 0) {
1173 attn3 *= attn3;
1174 value += attn3 * attn3 *
extrapolate4(ctx, xsb + 0, ysb + 0, zsb + 1, wsb + 0, dx3, dy3, dz3, dw3);
1175 }
1176
1177
1178 dx4 = dx2;
1179 dy4 = dy1;
1180 dz4 = dz1;
1182 attn4 = 2 - dx4 * dx4 - dy4 * dy4 - dz4 * dz4 - dw4 * dw4;
1183 if (attn4 > 0) {
1184 attn4 *= attn4;
1185 value += attn4 * attn4 *
extrapolate4(ctx, xsb + 0, ysb + 0, zsb + 0, wsb + 1, dx4, dy4, dz4, dw4);
1186 }
1187 } else if (inSum >= 3) {
1188
1189 aPoint = 0x0E;
1190 aScore = xins;
1191 bPoint = 0x0D;
1192 bScore = yins;
1193 if (aScore <= bScore && zins < bScore) {
1194 bScore = zins;
1195 bPoint = 0x0B;
1196 } else if (aScore > bScore && zins < aScore) {
1197 aScore = zins;
1198 aPoint = 0x0B;
1199 }
1200 if (aScore <= bScore && wins < bScore) {
1201 bScore = wins;
1202 bPoint = 0x07;
1203 } else if (aScore > bScore && wins < aScore) {
1204 aScore = wins;
1205 aPoint = 0x07;
1206 }
1207
1208
1209
1210 uins = 4 - inSum;
1211 if (uins < aScore || uins < bScore) {
1212 c = (bScore < aScore ? bPoint : aPoint);
1213
1214 if ((c & 0x01) != 0) {
1215 xsv_ext0 = xsb + 2;
1216 xsv_ext1 = xsv_ext2 = xsb + 1;
1219 } else {
1220 xsv_ext0 = xsv_ext1 = xsv_ext2 = xsb;
1222 }
1223
1224 if ((c & 0x02) != 0) {
1225 ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb + 1;
1227 if ((c & 0x01) != 0) {
1228 ysv_ext1 += 1;
1229 dy_ext1 -= 1;
1230 } else {
1231 ysv_ext0 += 1;
1232 dy_ext0 -= 1;
1233 }
1234 } else {
1235 ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb;
1237 }
1238
1239 if ((c & 0x04) != 0) {
1240 zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb + 1;
1242 if ((c & 0x03) != 0x03) {
1243 if ((c & 0x03) == 0) {
1244 zsv_ext0 += 1;
1245 dz_ext0 -= 1;
1246 } else {
1247 zsv_ext1 += 1;
1248 dz_ext1 -= 1;
1249 }
1250 } else {
1251 zsv_ext2 += 1;
1252 dz_ext2 -= 1;
1253 }
1254 } else {
1255 zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb;
1257 }
1258
1259 if ((c & 0x08) != 0) {
1260 wsv_ext0 = wsv_ext1 = wsb + 1;
1261 wsv_ext2 = wsb + 2;
1264 } else {
1265 wsv_ext0 = wsv_ext1 = wsv_ext2 = wsb;
1267 }
1268 } else {
1269 c = (int8_t)(aPoint & bPoint);
1270
1271 if ((c & 0x01) != 0) {
1272 xsv_ext0 = xsv_ext2 = xsb + 1;
1273 xsv_ext1 = xsb + 2;
1277 } else {
1278 xsv_ext0 = xsv_ext1 = xsv_ext2 = xsb;
1281 }
1282
1283 if ((c & 0x02) != 0) {
1284 ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb + 1;
1287 if ((c & 0x01) != 0) {
1288 ysv_ext2 += 1;
1289 dy_ext2 -= 1;
1290 } else {
1291 ysv_ext1 += 1;
1292 dy_ext1 -= 1;
1293 }
1294 } else {
1295 ysv_ext0 = ysv_ext1 = ysv_ext2 = ysb;
1298 }
1299
1300 if ((c & 0x04) != 0) {
1301 zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb + 1;
1304 if ((c & 0x03) != 0) {
1305 zsv_ext2 += 1;
1306 dz_ext2 -= 1;
1307 } else {
1308 zsv_ext1 += 1;
1309 dz_ext1 -= 1;
1310 }
1311 } else {
1312 zsv_ext0 = zsv_ext1 = zsv_ext2 = zsb;
1315 }
1316
1317 if ((c & 0x08) != 0) {
1318 wsv_ext0 = wsv_ext1 = wsb + 1;
1319 wsv_ext2 = wsb + 2;
1323 } else {
1324 wsv_ext0 = wsv_ext1 = wsv_ext2 = wsb;
1327 }
1328 }
1329
1330
1335 attn4 = 2 - dx4 * dx4 - dy4 * dy4 - dz4 * dz4 - dw4 * dw4;
1336 if (attn4 > 0) {
1337 attn4 *= attn4;
1338 value += attn4 * attn4 *
extrapolate4(ctx, xsb + 1, ysb + 1, zsb + 1, wsb + 0, dx4, dy4, dz4, dw4);
1339 }
1340
1341
1342 dx3 = dx4;
1343 dy3 = dy4;
1346 attn3 = 2 - dx3 * dx3 - dy3 * dy3 - dz3 * dz3 - dw3 * dw3;
1347 if (attn3 > 0) {
1348 attn3 *= attn3;
1349 value += attn3 * attn3 *
extrapolate4(ctx, xsb + 1, ysb + 1, zsb + 0, wsb + 1, dx3, dy3, dz3, dw3);
1350 }
1351
1352
1353 dx2 = dx4;
1355 dz2 = dz4;
1356 dw2 = dw3;
1357 attn2 = 2 - dx2 * dx2 - dy2 * dy2 - dz2 * dz2 - dw2 * dw2;
1358 if (attn2 > 0) {
1359 attn2 *= attn2;
1360 value += attn2 * attn2 *
extrapolate4(ctx, xsb + 1, ysb + 0, zsb + 1, wsb + 1, dx2, dy2, dz2, dw2);
1361 }
1362
1363
1365 dz1 = dz4;
1366 dy1 = dy4;
1367 dw1 = dw3;
1368 attn1 = 2 - dx1 * dx1 - dy1 * dy1 - dz1 * dz1 - dw1 * dw1;
1369 if (attn1 > 0) {
1370 attn1 *= attn1;
1371 value += attn1 * attn1 *
extrapolate4(ctx, xsb + 0, ysb + 1, zsb + 1, wsb + 1, dx1, dy1, dz1, dw1);
1372 }
1373
1374
1379 attn0 = 2 - dx0 * dx0 - dy0 * dy0 - dz0 * dz0 - dw0 * dw0;
1380 if (attn0 > 0) {
1381 attn0 *= attn0;
1382 value += attn0 * attn0 *
extrapolate4(ctx, xsb + 1, ysb + 1, zsb + 1, wsb + 1, dx0, dy0, dz0, dw0);
1383 }
1384 } else if (inSum <= 2) {
1385 aIsBiggerSide = 1;
1386 bIsBiggerSide = 1;
1387
1388
1389 if (xins + yins > zins + wins) {
1390 aScore = xins + yins;
1391 aPoint = 0x03;
1392 } else {
1393 aScore = zins + wins;
1394 aPoint = 0x0C;
1395 }
1396
1397
1398 if (xins + zins > yins + wins) {
1399 bScore = xins + zins;
1400 bPoint = 0x05;
1401 } else {
1402 bScore = yins + wins;
1403 bPoint = 0x0A;
1404 }
1405
1406
1407 if (xins + wins > yins + zins) {
1408 score = xins + wins;
1409 if (aScore >= bScore && score > bScore) {
1410 bScore = score;
1411 bPoint = 0x09;
1412 } else if (aScore < bScore && score > aScore) {
1413 aScore = score;
1414 aPoint = 0x09;
1415 }
1416 } else {
1417 score = yins + zins;
1418 if (aScore >= bScore && score > bScore) {
1419 bScore = score;
1420 bPoint = 0x06;
1421 } else if (aScore < bScore && score > aScore) {
1422 aScore = score;
1423 aPoint = 0x06;
1424 }
1425 }
1426
1427
1428 p1 = 2 - inSum + xins;
1429 if (aScore >= bScore &&
p1 > bScore) {
1431 bPoint = 0x01;
1432 bIsBiggerSide = 0;
1433 } else if (aScore < bScore && p1 > aScore) {
1435 aPoint = 0x01;
1436 aIsBiggerSide = 0;
1437 }
1438
1439
1440 p2 = 2 - inSum + yins;
1441 if (aScore >= bScore &&
p2 > bScore) {
1443 bPoint = 0x02;
1444 bIsBiggerSide = 0;
1445 } else if (aScore < bScore && p2 > aScore) {
1447 aPoint = 0x02;
1448 aIsBiggerSide = 0;
1449 }
1450
1451
1452 p3 = 2 - inSum + zins;
1453 if (aScore >= bScore &&
p3 > bScore) {
1455 bPoint = 0x04;
1456 bIsBiggerSide = 0;
1457 } else if (aScore < bScore && p3 > aScore) {
1459 aPoint = 0x04;
1460 aIsBiggerSide = 0;
1461 }
1462
1463
1464 p4 = 2 - inSum + wins;
1465 if (aScore >= bScore && p4 > bScore) {
1466 bScore = p4;
1467 bPoint = 0x08;
1468 bIsBiggerSide = 0;
1469 } else if (aScore < bScore && p4 > aScore) {
1470 aScore = p4;
1471 aPoint = 0x08;
1472 aIsBiggerSide = 0;
1473 }
1474
1475
1476 if (aIsBiggerSide == bIsBiggerSide) {
1477 if (aIsBiggerSide) {
1478 c1 = (int8_t)(aPoint | bPoint);
1479 c2 = (int8_t)(aPoint & bPoint);
1480 if ((c1 & 0x01) == 0) {
1481 xsv_ext0 = xsb;
1482 xsv_ext1 = xsb - 1;
1485 } else {
1486 xsv_ext0 = xsv_ext1 = xsb + 1;
1489 }
1490
1491 if ((c1 & 0x02) == 0) {
1492 ysv_ext0 = ysb;
1493 ysv_ext1 = ysb - 1;
1496 } else {
1497 ysv_ext0 = ysv_ext1 = ysb + 1;
1500 }
1501
1502 if ((c1 & 0x04) == 0) {
1503 zsv_ext0 = zsb;
1504 zsv_ext1 = zsb - 1;
1507 } else {
1508 zsv_ext0 = zsv_ext1 = zsb + 1;
1511 }
1512
1513 if ((c1 & 0x08) == 0) {
1514 wsv_ext0 = wsb;
1515 wsv_ext1 = wsb - 1;
1518 } else {
1519 wsv_ext0 = wsv_ext1 = wsb + 1;
1522 }
1523
1524
1525 xsv_ext2 = xsb;
1526 ysv_ext2 = ysb;
1527 zsv_ext2 = zsb;
1528 wsv_ext2 = wsb;
1533 if ((c2 & 0x01) != 0) {
1534 xsv_ext2 += 2;
1535 dx_ext2 -= 2;
1536 } else if ((c2 & 0x02) != 0) {
1537 ysv_ext2 += 2;
1538 dy_ext2 -= 2;
1539 } else if ((c2 & 0x04) != 0) {
1540 zsv_ext2 += 2;
1541 dz_ext2 -= 2;
1542 } else {
1543 wsv_ext2 += 2;
1544 dw_ext2 -= 2;
1545 }
1546
1547 } else {
1548
1549 xsv_ext2 = xsb;
1550 ysv_ext2 = ysb;
1551 zsv_ext2 = zsb;
1552 wsv_ext2 = wsb;
1553 dx_ext2 = dx0;
1554 dy_ext2 = dy0;
1555 dz_ext2 = dz0;
1556 dw_ext2 = dw0;
1557
1558
1559 c = (int8_t)(aPoint | bPoint);
1560
1561 if ((c & 0x01) == 0) {
1562 xsv_ext0 = xsb - 1;
1563 xsv_ext1 = xsb;
1566 } else {
1567 xsv_ext0 = xsv_ext1 = xsb + 1;
1569 }
1570
1571 if ((c & 0x02) == 0) {
1572 ysv_ext0 = ysv_ext1 = ysb;
1574 if ((c & 0x01) == 0x01)
1575 {
1576 ysv_ext0 -= 1;
1577 dy_ext0 += 1;
1578 } else {
1579 ysv_ext1 -= 1;
1580 dy_ext1 += 1;
1581 }
1582 } else {
1583 ysv_ext0 = ysv_ext1 = ysb + 1;
1585 }
1586
1587 if ((c & 0x04) == 0) {
1588 zsv_ext0 = zsv_ext1 = zsb;
1590 if ((c & 0x03) == 0x03)
1591 {
1592 zsv_ext0 -= 1;
1593 dz_ext0 += 1;
1594 } else {
1595 zsv_ext1 -= 1;
1596 dz_ext1 += 1;
1597 }
1598 } else {
1599 zsv_ext0 = zsv_ext1 = zsb + 1;
1601 }
1602
1603 if ((c & 0x08) == 0)
1604 {
1605 wsv_ext0 = wsb;
1606 wsv_ext1 = wsb - 1;
1609 } else {
1610 wsv_ext0 = wsv_ext1 = wsb + 1;
1612 }
1613
1614 }
1615 } else {
1616 if (aIsBiggerSide) {
1617 c1 = aPoint;
1618 c2 = bPoint;
1619 } else {
1620 c1 = bPoint;
1621 c2 = aPoint;
1622 }
1623
1624
1625 if ((c1 & 0x01) == 0) {
1626 xsv_ext0 = xsb - 1;
1627 xsv_ext1 = xsb;
1630 } else {
1631 xsv_ext0 = xsv_ext1 = xsb + 1;
1633 }
1634
1635 if ((c1 & 0x02) == 0) {
1636 ysv_ext0 = ysv_ext1 = ysb;
1638 if ((c1 & 0x01) == 0x01) {
1639 ysv_ext0 -= 1;
1640 dy_ext0 += 1;
1641 } else {
1642 ysv_ext1 -= 1;
1643 dy_ext1 += 1;
1644 }
1645 } else {
1646 ysv_ext0 = ysv_ext1 = ysb + 1;
1648 }
1649
1650 if ((c1 & 0x04) == 0) {
1651 zsv_ext0 = zsv_ext1 = zsb;
1653 if ((c1 & 0x03) == 0x03) {
1654 zsv_ext0 -= 1;
1655 dz_ext0 += 1;
1656 } else {
1657 zsv_ext1 -= 1;
1658 dz_ext1 += 1;
1659 }
1660 } else {
1661 zsv_ext0 = zsv_ext1 = zsb + 1;
1663 }
1664
1665 if ((c1 & 0x08) == 0) {
1666 wsv_ext0 = wsb;
1667 wsv_ext1 = wsb - 1;
1670 } else {
1671 wsv_ext0 = wsv_ext1 = wsb + 1;
1673 }
1674
1675
1676 xsv_ext2 = xsb;
1677 ysv_ext2 = ysb;
1678 zsv_ext2 = zsb;
1679 wsv_ext2 = wsb;
1684 if ((c2 & 0x01) != 0) {
1685 xsv_ext2 += 2;
1686 dx_ext2 -= 2;
1687 } else if ((c2 & 0x02) != 0) {
1688 ysv_ext2 += 2;
1689 dy_ext2 -= 2;
1690 } else if ((c2 & 0x04) != 0) {
1691 zsv_ext2 += 2;
1692 dz_ext2 -= 2;
1693 } else {
1694 wsv_ext2 += 2;
1695 dw_ext2 -= 2;
1696 }
1697 }
1698
1699
1704 attn1 = 2 - dx1 * dx1 - dy1 * dy1 - dz1 * dz1 - dw1 * dw1;
1705 if (attn1 > 0) {
1706 attn1 *= attn1;
1707 value += attn1 * attn1 *
extrapolate4(ctx, xsb + 1, ysb + 0, zsb + 0, wsb + 0, dx1, dy1, dz1, dw1);
1708 }
1709
1710
1713 dz2 = dz1;
1714 dw2 = dw1;
1715 attn2 = 2 - dx2 * dx2 - dy2 * dy2 - dz2 * dz2 - dw2 * dw2;
1716 if (attn2 > 0) {
1717 attn2 *= attn2;
1718 value += attn2 * attn2 *
extrapolate4(ctx, xsb + 0, ysb + 1, zsb + 0, wsb + 0, dx2, dy2, dz2, dw2);
1719 }
1720
1721
1722 dx3 = dx2;
1723 dy3 = dy1;
1725 dw3 = dw1;
1726 attn3 = 2 - dx3 * dx3 - dy3 * dy3 - dz3 * dz3 - dw3 * dw3;
1727 if (attn3 > 0) {
1728 attn3 *= attn3;
1729 value += attn3 * attn3 *
extrapolate4(ctx, xsb + 0, ysb + 0, zsb + 1, wsb + 0, dx3, dy3, dz3, dw3);
1730 }
1731
1732
1733 dx4 = dx2;
1734 dy4 = dy1;
1735 dz4 = dz1;
1737 attn4 = 2 - dx4 * dx4 - dy4 * dy4 - dz4 * dz4 - dw4 * dw4;
1738 if (attn4 > 0) {
1739 attn4 *= attn4;
1740 value += attn4 * attn4 *
extrapolate4(ctx, xsb + 0, ysb + 0, zsb + 0, wsb + 1, dx4, dy4, dz4, dw4);
1741 }
1742
1743
1748 attn5 = 2 - dx5 * dx5 - dy5 * dy5 - dz5 * dz5 - dw5 * dw5;
1749 if (attn5 > 0) {
1750 attn5 *= attn5;
1751 value += attn5 * attn5 *
extrapolate4(ctx, xsb + 1, ysb + 1, zsb + 0, wsb + 0, dx5, dy5, dz5, dw5);
1752 }
1753
1754
1759 attn6 = 2 - dx6 * dx6 - dy6 * dy6 - dz6 * dz6 - dw6 * dw6;
1760 if (attn6 > 0) {
1761 attn6 *= attn6;
1762 value += attn6 * attn6 *
extrapolate4(ctx, xsb + 1, ysb + 0, zsb + 1, wsb + 0, dx6, dy6, dz6, dw6);
1763 }
1764
1765
1770 attn7 = 2 - dx7 * dx7 - dy7 * dy7 - dz7 * dz7 - dw7 * dw7;
1771 if (attn7 > 0) {
1772 attn7 *= attn7;
1773 value += attn7 * attn7 *
extrapolate4(ctx, xsb + 1, ysb + 0, zsb + 0, wsb + 1, dx7, dy7, dz7, dw7);
1774 }
1775
1776
1781 attn8 = 2 - dx8 * dx8 - dy8 * dy8 - dz8 * dz8 - dw8 * dw8;
1782 if (attn8 > 0) {
1783 attn8 *= attn8;
1784 value += attn8 * attn8 *
extrapolate4(ctx, xsb + 0, ysb + 1, zsb + 1, wsb + 0, dx8, dy8, dz8, dw8);
1785 }
1786
1787
1792 attn9 = 2 - dx9 * dx9 - dy9 * dy9 - dz9 * dz9 - dw9 * dw9;
1793 if (attn9 > 0) {
1794 attn9 *= attn9;
1795 value += attn9 * attn9 *
extrapolate4(ctx, xsb + 0, ysb + 1, zsb + 0, wsb + 1, dx9, dy9, dz9, dw9);
1796 }
1797
1798
1803 attn10 = 2 - dx10 * dx10 - dy10 * dy10 - dz10 * dz10 - dw10 * dw10;
1804 if (attn10 > 0) {
1805 attn10 *= attn10;
1806 value += attn10 * attn10 *
extrapolate4(ctx, xsb + 0, ysb + 0, zsb + 1, wsb + 1, dx10, dy10, dz10, dw10);
1807 }
1808 } else {
1809 aIsBiggerSide = 1;
1810 bIsBiggerSide = 1;
1811
1812
1813 if (xins + yins < zins + wins) {
1814 aScore = xins + yins;
1815 aPoint = 0x0C;
1816 } else {
1817 aScore = zins + wins;
1818 aPoint = 0x03;
1819 }
1820
1821
1822 if (xins + zins < yins + wins) {
1823 bScore = xins + zins;
1824 bPoint = 0x0A;
1825 } else {
1826 bScore = yins + wins;
1827 bPoint = 0x05;
1828 }
1829
1830
1831 if (xins + wins < yins + zins) {
1832 score = xins + wins;
1833 if (aScore <= bScore && score < bScore) {
1834 bScore = score;
1835 bPoint = 0x06;
1836 } else if (aScore > bScore && score < aScore) {
1837 aScore = score;
1838 aPoint = 0x06;
1839 }
1840 } else {
1841 score = yins + zins;
1842 if (aScore <= bScore && score < bScore) {
1843 bScore = score;
1844 bPoint = 0x09;
1845 } else if (aScore > bScore && score < aScore) {
1846 aScore = score;
1847 aPoint = 0x09;
1848 }
1849 }
1850
1851
1852 p1 = 3 - inSum + xins;
1853 if (aScore <= bScore &&
p1 < bScore) {
1855 bPoint = 0x0E;
1856 bIsBiggerSide = 0;
1857 }
else if (aScore > bScore &&
p1 < aScore) {
1859 aPoint = 0x0E;
1860 aIsBiggerSide = 0;
1861 }
1862
1863
1864 p2 = 3 - inSum + yins;
1865 if (aScore <= bScore &&
p2 < bScore) {
1867 bPoint = 0x0D;
1868 bIsBiggerSide = 0;
1869 }
else if (aScore > bScore &&
p2 < aScore) {
1871 aPoint = 0x0D;
1872 aIsBiggerSide = 0;
1873 }
1874
1875
1876 p3 = 3 - inSum + zins;
1877 if (aScore <= bScore &&
p3 < bScore) {
1879 bPoint = 0x0B;
1880 bIsBiggerSide = 0;
1881 }
else if (aScore > bScore &&
p3 < aScore) {
1883 aPoint = 0x0B;
1884 aIsBiggerSide = 0;
1885 }
1886
1887
1888 p4 = 3 - inSum + wins;
1889 if (aScore <= bScore && p4 < bScore) {
1890 bScore = p4;
1891 bPoint = 0x07;
1892 bIsBiggerSide = 0;
1893 } else if (aScore > bScore && p4 < aScore) {
1894 aScore = p4;
1895 aPoint = 0x07;
1896 aIsBiggerSide = 0;
1897 }
1898
1899
1900 if (aIsBiggerSide == bIsBiggerSide) {
1901 if (aIsBiggerSide) {
1902 c1 = (int8_t)(aPoint & bPoint);
1903 c2 = (int8_t)(aPoint | bPoint);
1904
1905
1906 xsv_ext0 = xsv_ext1 = xsb;
1907 ysv_ext0 = ysv_ext1 = ysb;
1908 zsv_ext0 = zsv_ext1 = zsb;
1909 wsv_ext0 = wsv_ext1 = wsb;
1918 if ((c1 & 0x01) != 0) {
1919 xsv_ext0 += 1;
1920 dx_ext0 -= 1;
1921 xsv_ext1 += 2;
1922 dx_ext1 -= 2;
1923 } else if ((c1 & 0x02) != 0) {
1924 ysv_ext0 += 1;
1925 dy_ext0 -= 1;
1926 ysv_ext1 += 2;
1927 dy_ext1 -= 2;
1928 } else if ((c1 & 0x04) != 0) {
1929 zsv_ext0 += 1;
1930 dz_ext0 -= 1;
1931 zsv_ext1 += 2;
1932 dz_ext1 -= 2;
1933 } else {
1934 wsv_ext0 += 1;
1935 dw_ext0 -= 1;
1936 wsv_ext1 += 2;
1937 dw_ext1 -= 2;
1938 }
1939
1940
1941 xsv_ext2 = xsb + 1;
1942 ysv_ext2 = ysb + 1;
1943 zsv_ext2 = zsb + 1;
1944 wsv_ext2 = wsb + 1;
1949 if ((c2 & 0x01) == 0) {
1950 xsv_ext2 -= 2;
1951 dx_ext2 += 2;
1952 } else if ((c2 & 0x02) == 0) {
1953 ysv_ext2 -= 2;
1954 dy_ext2 += 2;
1955 } else if ((c2 & 0x04) == 0) {
1956 zsv_ext2 -= 2;
1957 dz_ext2 += 2;
1958 } else {
1959 wsv_ext2 -= 2;
1960 dw_ext2 += 2;
1961 }
1962 } else {
1963
1964 xsv_ext2 = xsb + 1;
1965 ysv_ext2 = ysb + 1;
1966 zsv_ext2 = zsb + 1;
1967 wsv_ext2 = wsb + 1;
1972
1973
1974 c = (int8_t)(aPoint & bPoint);
1975
1976 if ((c & 0x01) != 0) {
1977 xsv_ext0 = xsb + 2;
1978 xsv_ext1 = xsb + 1;
1981 } else {
1982 xsv_ext0 = xsv_ext1 = xsb;
1984 }
1985
1986 if ((c & 0x02) != 0) {
1987 ysv_ext0 = ysv_ext1 = ysb + 1;
1989 if ((c & 0x01) == 0)
1990 {
1991 ysv_ext0 += 1;
1992 dy_ext0 -= 1;
1993 } else {
1994 ysv_ext1 += 1;
1995 dy_ext1 -= 1;
1996 }
1997 } else {
1998 ysv_ext0 = ysv_ext1 = ysb;
2000 }
2001
2002 if ((c & 0x04) != 0) {
2003 zsv_ext0 = zsv_ext1 = zsb + 1;
2005 if ((c & 0x03) == 0)
2006 {
2007 zsv_ext0 += 1;
2008 dz_ext0 -= 1;
2009 } else {
2010 zsv_ext1 += 1;
2011 dz_ext1 -= 1;
2012 }
2013 } else {
2014 zsv_ext0 = zsv_ext1 = zsb;
2016 }
2017
2018 if ((c & 0x08) != 0)
2019 {
2020 wsv_ext0 = wsb + 1;
2021 wsv_ext1 = wsb + 2;
2024 } else {
2025 wsv_ext0 = wsv_ext1 = wsb;
2027 }
2028 }
2029 } else {
2030 if (aIsBiggerSide) {
2031 c1 = aPoint;
2032 c2 = bPoint;
2033 } else {
2034 c1 = bPoint;
2035 c2 = aPoint;
2036 }
2037
2038
2039 if ((c1 & 0x01) != 0) {
2040 xsv_ext0 = xsb + 2;
2041 xsv_ext1 = xsb + 1;
2044 } else {
2045 xsv_ext0 = xsv_ext1 = xsb;
2047 }
2048
2049 if ((c1 & 0x02) != 0) {
2050 ysv_ext0 = ysv_ext1 = ysb + 1;
2052 if ((c1 & 0x01) == 0) {
2053 ysv_ext0 += 1;
2054 dy_ext0 -= 1;
2055 } else {
2056 ysv_ext1 += 1;
2057 dy_ext1 -= 1;
2058 }
2059 } else {
2060 ysv_ext0 = ysv_ext1 = ysb;
2062 }
2063
2064 if ((c1 & 0x04) != 0) {
2065 zsv_ext0 = zsv_ext1 = zsb + 1;
2067 if ((c1 & 0x03) == 0) {
2068 zsv_ext0 += 1;
2069 dz_ext0 -= 1;
2070 } else {
2071 zsv_ext1 += 1;
2072 dz_ext1 -= 1;
2073 }
2074 } else {
2075 zsv_ext0 = zsv_ext1 = zsb;
2077 }
2078
2079 if ((c1 & 0x08) != 0) {
2080 wsv_ext0 = wsb + 1;
2081 wsv_ext1 = wsb + 2;
2084 } else {
2085 wsv_ext0 = wsv_ext1 = wsb;
2087 }
2088
2089
2090 xsv_ext2 = xsb + 1;
2091 ysv_ext2 = ysb + 1;
2092 zsv_ext2 = zsb + 1;
2093 wsv_ext2 = wsb + 1;
2098 if ((c2 & 0x01) == 0) {
2099 xsv_ext2 -= 2;
2100 dx_ext2 += 2;
2101 } else if ((c2 & 0x02) == 0) {
2102 ysv_ext2 -= 2;
2103 dy_ext2 += 2;
2104 } else if ((c2 & 0x04) == 0) {
2105 zsv_ext2 -= 2;
2106 dz_ext2 += 2;
2107 } else {
2108 wsv_ext2 -= 2;
2109 dw_ext2 += 2;
2110 }
2111 }
2112
2113
2118 attn4 = 2 - dx4 * dx4 - dy4 * dy4 - dz4 * dz4 - dw4 * dw4;
2119 if (attn4 > 0) {
2120 attn4 *= attn4;
2121 value += attn4 * attn4 *
extrapolate4(ctx, xsb + 1, ysb + 1, zsb + 1, wsb + 0, dx4, dy4, dz4, dw4);
2122 }
2123
2124
2125 dx3 = dx4;
2126 dy3 = dy4;
2129 attn3 = 2 - dx3 * dx3 - dy3 * dy3 - dz3 * dz3 - dw3 * dw3;
2130 if (attn3 > 0) {
2131 attn3 *= attn3;
2132 value += attn3 * attn3 *
extrapolate4(ctx, xsb + 1, ysb + 1, zsb + 0, wsb + 1, dx3, dy3, dz3, dw3);
2133 }
2134
2135
2136 dx2 = dx4;
2138 dz2 = dz4;
2139 dw2 = dw3;
2140 attn2 = 2 - dx2 * dx2 - dy2 * dy2 - dz2 * dz2 - dw2 * dw2;
2141 if (attn2 > 0) {
2142 attn2 *= attn2;
2143 value += attn2 * attn2 *
extrapolate4(ctx, xsb + 1, ysb + 0, zsb + 1, wsb + 1, dx2, dy2, dz2, dw2);
2144 }
2145
2146
2148 dz1 = dz4;
2149 dy1 = dy4;
2150 dw1 = dw3;
2151 attn1 = 2 - dx1 * dx1 - dy1 * dy1 - dz1 * dz1 - dw1 * dw1;
2152 if (attn1 > 0) {
2153 attn1 *= attn1;
2154 value += attn1 * attn1 *
extrapolate4(ctx, xsb + 0, ysb + 1, zsb + 1, wsb + 1, dx1, dy1, dz1, dw1);
2155 }
2156
2157
2162 attn5 = 2 - dx5 * dx5 - dy5 * dy5 - dz5 * dz5 - dw5 * dw5;
2163 if (attn5 > 0) {
2164 attn5 *= attn5;
2165 value += attn5 * attn5 *
extrapolate4(ctx, xsb + 1, ysb + 1, zsb + 0, wsb + 0, dx5, dy5, dz5, dw5);
2166 }
2167
2168
2173 attn6 = 2 - dx6 * dx6 - dy6 * dy6 - dz6 * dz6 - dw6 * dw6;
2174 if (attn6 > 0) {
2175 attn6 *= attn6;
2176 value += attn6 * attn6 *
extrapolate4(ctx, xsb + 1, ysb + 0, zsb + 1, wsb + 0, dx6, dy6, dz6, dw6);
2177 }
2178
2179
2184 attn7 = 2 - dx7 * dx7 - dy7 * dy7 - dz7 * dz7 - dw7 * dw7;
2185 if (attn7 > 0) {
2186 attn7 *= attn7;
2187 value += attn7 * attn7 *
extrapolate4(ctx, xsb + 1, ysb + 0, zsb + 0, wsb + 1, dx7, dy7, dz7, dw7);
2188 }
2189
2190
2195 attn8 = 2 - dx8 * dx8 - dy8 * dy8 - dz8 * dz8 - dw8 * dw8;
2196 if (attn8 > 0) {
2197 attn8 *= attn8;
2198 value += attn8 * attn8 *
extrapolate4(ctx, xsb + 0, ysb + 1, zsb + 1, wsb + 0, dx8, dy8, dz8, dw8);
2199 }
2200
2201
2206 attn9 = 2 - dx9 * dx9 - dy9 * dy9 - dz9 * dz9 - dw9 * dw9;
2207 if (attn9 > 0) {
2208 attn9 *= attn9;
2209 value += attn9 * attn9 *
extrapolate4(ctx, xsb + 0, ysb + 1, zsb + 0, wsb + 1, dx9, dy9, dz9, dw9);
2210 }
2211
2212
2217 attn10 = 2 - dx10 * dx10 - dy10 * dy10 - dz10 * dz10 - dw10 * dw10;
2218 if (attn10 > 0) {
2219 attn10 *= attn10;
2220 value += attn10 * attn10 *
extrapolate4(ctx, xsb + 0, ysb + 0, zsb + 1, wsb + 1, dx10, dy10, dz10, dw10);
2221 }
2222 }
2223
2224
2225 attn_ext0 = 2 - dx_ext0 * dx_ext0 - dy_ext0 * dy_ext0 - dz_ext0 * dz_ext0 - dw_ext0 * dw_ext0;
2226 if (attn_ext0 > 0)
2227 {
2228 attn_ext0 *= attn_ext0;
2229 value += attn_ext0 * attn_ext0 *
extrapolate4(ctx, xsv_ext0, ysv_ext0, zsv_ext0, wsv_ext0, dx_ext0, dy_ext0, dz_ext0, dw_ext0);
2230 }
2231
2232
2233 attn_ext1 = 2 - dx_ext1 * dx_ext1 - dy_ext1 * dy_ext1 - dz_ext1 * dz_ext1 - dw_ext1 * dw_ext1;
2234 if (attn_ext1 > 0)
2235 {
2236 attn_ext1 *= attn_ext1;
2237 value += attn_ext1 * attn_ext1 *
extrapolate4(ctx, xsv_ext1, ysv_ext1, zsv_ext1, wsv_ext1, dx_ext1, dy_ext1, dz_ext1, dw_ext1);
2238 }
2239
2240
2241 attn_ext2 = 2 - dx_ext2 * dx_ext2 - dy_ext2 * dy_ext2 - dz_ext2 * dz_ext2 - dw_ext2 * dw_ext2;
2242 if (attn_ext2 > 0)
2243 {
2244 attn_ext2 *= attn_ext2;
2245 value += attn_ext2 * attn_ext2 *
extrapolate4(ctx, xsv_ext2, ysv_ext2, zsv_ext2, wsv_ext2, dx_ext2, dy_ext2, dz_ext2, dw_ext2);
2246 }
2247
2249}
#define SQUISH_CONSTANT_4D
static double extrapolate4(struct osn_context *ctx, int xsb, int ysb, int zsb, int wsb, double dx, double dy, double dz, double dw)
#define STRETCH_CONSTANT_4D