|
1070 | 1070 | }
|
1071 | 1071 |
|
1072 | 1072 | public:
|
1073 |
| - static double *ranfloat; |
1074 |
| - static int *perm_x; |
1075 |
| - static int *perm_y; |
1076 |
| - static int *perm_z; |
| 1073 | + static const int point_count = 256; |
| 1074 | + static double* ranfloat; |
| 1075 | + static int* perm_x; |
| 1076 | + static int* perm_y; |
| 1077 | + static int* perm_z; |
1077 | 1078 | };
|
1078 | 1079 |
|
1079 | 1080 | static double* perlin_generate() {
|
1080 |
| - auto p = new double[256]; |
1081 |
| - for (int i = 0; i < 256; ++i) |
| 1081 | + auto p = new double[perlin::point_count]; |
| 1082 | + for (int i = 0; i < perlin::point_count; ++i) |
1082 | 1083 | p[i] = random_double();
|
1083 | 1084 | return p;
|
1084 | 1085 | }
|
1085 | 1086 |
|
1086 |
| - void permute(int *p, int n) { |
| 1087 | + void permute(int* p, int n) { |
1087 | 1088 | for (int i = n-1; i > 0; i--) {
|
1088 | 1089 | int target = random_int(0, i);
|
1089 | 1090 | int tmp = p[i];
|
1090 | 1091 | p[i] = p[target];
|
1091 | 1092 | p[target] = tmp;
|
1092 | 1093 | }
|
1093 |
| - return; |
1094 | 1094 | }
|
1095 | 1095 |
|
1096 |
| - static int* perlin_generate_perm() { |
1097 |
| - int * p = new int[256]; |
1098 |
| - for (int i = 0; i < 256; i++) |
| 1096 | + static int* perlin_generate_perm(int p[]) { |
| 1097 | + for (int i = 0; i < perlin::point_count; i++) |
1099 | 1098 | p[i] = i;
|
1100 |
| - permute(p, 256); |
| 1099 | + |
| 1100 | + permute(p, perlin::point_count); |
| 1101 | + |
1101 | 1102 | return p;
|
1102 | 1103 | }
|
1103 | 1104 |
|
1104 |
| - double *perlin::ranfloat = perlin_generate(); |
1105 |
| - int *perlin::perm_x = perlin_generate_perm(); |
1106 |
| - int *perlin::perm_y = perlin_generate_perm(); |
1107 |
| - int *perlin::perm_z = perlin_generate_perm(); |
| 1105 | + double* perlin::ranfloat = perlin_generate(); |
| 1106 | + |
| 1107 | + int perlin_values[3][perlin::point_count]; |
| 1108 | + int* perlin::perm_x = perlin_generate_perm(perlin_values[0]); |
| 1109 | + int* perlin::perm_y = perlin_generate_perm(perlin_values[1]); |
| 1110 | + int* perlin::perm_z = perlin_generate_perm(perlin_values[2]); |
1108 | 1111 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
1109 | 1112 | [Listing [perlin]: <kbd>[perlin.h]</kbd> A Perlin texture class and functions]
|
1110 | 1113 | </div>
|
|
1206 | 1209 | }
|
1207 | 1210 |
|
1208 | 1211 | public:
|
1209 |
| - static int *perm_x; |
1210 |
| - static int *perm_y; |
1211 |
| - static int *perm_z; |
| 1212 | + static const int point_count = 256; |
| 1213 | + static int* perm_x; |
| 1214 | + static int* perm_y; |
| 1215 | + static int* perm_z; |
1212 | 1216 | }
|
1213 | 1217 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
1214 | 1218 | [Listing [perlin-trilinear]: <kbd>[perlin.h]</kbd> Perlin with trilienear interpolation]
|
|
1290 | 1294 | max off the lattice. So, first we need to change the random floats to random vectors:
|
1291 | 1295 |
|
1292 | 1296 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
|
1293 |
| - vec3 *perlin::ranvec = perlin_generate(); |
1294 |
| - int *perlin::perm_x = perlin_generate_perm(); |
1295 |
| - int *perlin::perm_y = perlin_generate_perm(); |
1296 |
| - int *perlin::perm_z = perlin_generate_perm(); |
| 1297 | + vec3* perlin::ranvec = perlin_generate(); |
| 1298 | + |
| 1299 | + int perlin_values[3][perlin::point_count]; |
| 1300 | + int* perlin::perm_x = perlin_generate_perm(perlin_values[0]); |
| 1301 | + int* perlin::perm_y = perlin_generate_perm(perlin_values[1]); |
| 1302 | + int* perlin::perm_z = perlin_generate_perm(perlin_values[2]); |
1297 | 1303 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
1298 | 1304 | [Listing [perlin-randunit]: <kbd>[perlin.h]</kbd> Perlin with random unit translations]
|
1299 | 1305 | </div>
|
|
1304 | 1310 |
|
1305 | 1311 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ C++
|
1306 | 1312 | static vec3* perlin_generate() {
|
1307 |
| - vec3 *p = new vec3[256]; |
1308 |
| - for (int i = 0; i < 256; ++i) { |
| 1313 | + static vec3 p[perlin::point_count]; |
| 1314 | + |
| 1315 | + for (int i = 0; i < perlin::point_count; ++i) { |
1309 | 1316 | p[i] = unit_vector(vec3::random(-1,1));
|
1310 | 1317 | }
|
| 1318 | + |
1311 | 1319 | return p;
|
1312 | 1320 | }
|
1313 | 1321 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
1340 | 1348 | }
|
1341 | 1349 |
|
1342 | 1350 | public:
|
1343 |
| - static vec3 *ranvec; |
1344 |
| - static int *perm_x; |
1345 |
| - static int *perm_y; |
1346 |
| - static int *perm_z; |
| 1351 | + static const int point_count = 256; |
| 1352 | + static vec3* ranvec; |
| 1353 | + static int* perm_x; |
| 1354 | + static int* perm_y; |
| 1355 | + static int* perm_z; |
1347 | 1356 | }
|
1348 | 1357 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
1349 | 1358 | [Listing [perlin-2]: <kbd>[perlin.h]</kbd> The perlin class so far]
|
|
0 commit comments