JNoise.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  1. #include "JNoise.h"
  2. #include "FactorizeNoise.h"
  3. #include "FastNoiseWrapper.h"
  4. #include "FlattenNoise.h"
  5. #include "Game.h"
  6. #include "MultiplyNoise.h"
  7. #include "NegateNoise.h"
  8. #include "RandNoise.h"
  9. #include "ScaleNoise.h"
  10. using namespace Framework;
  11. Noise* JNoise::parseNoise(JSON::JSONValue* zConfig, JExpressionMemory* zMemory)
  12. {
  13. Text type = zConfig->asObject()->zValue("type")->asString()->getString();
  14. if (type.istGleich("random"))
  15. {
  16. JFloatExpression* seedExpression
  17. = Game::INSTANCE->zTypeRegistry()->fromJson<JFloatExpression>(
  18. zConfig->asObject()->zValue("seed"));
  19. seedExpression->compile(zMemory);
  20. float seed = seedExpression->getValue();
  21. seedExpression->release();
  22. return new RandNoise((int)(round(seed)));
  23. }
  24. else if (type.istGleich("factorize"))
  25. {
  26. double factor
  27. = zConfig->asObject()->zValue("factorA")->asNumber()->getNumber();
  28. Noise* a = parseNoise(zConfig->asObject()->zValue("noiseA"), zMemory);
  29. Noise* b = parseNoise(zConfig->asObject()->zValue("noiseB"), zMemory);
  30. return new FactorizeNoise(a, b, factor);
  31. }
  32. else if (type.istGleich("multiply"))
  33. {
  34. Noise* a = parseNoise(zConfig->asObject()->zValue("base"), zMemory);
  35. Noise* b
  36. = parseNoise(zConfig->asObject()->zValue("multiplier"), zMemory);
  37. return new MultiplyNoise(a, b);
  38. }
  39. else if (type.istGleich("negate"))
  40. {
  41. Noise* a = parseNoise(zConfig->asObject()->zValue("noise"), zMemory);
  42. return new NegateNoise(a);
  43. }
  44. else if (type.istGleich("flatten"))
  45. {
  46. Noise* a = parseNoise(zConfig->asObject()->zValue("noise"), zMemory);
  47. double factor
  48. = zConfig->asObject()->zValue("factor")->asNumber()->getNumber();
  49. double addition
  50. = zConfig->asObject()->zValue("addition")->asNumber()->getNumber();
  51. return new FlattenNoise(a, factor, addition);
  52. }
  53. else if (type.istGleich("scale"))
  54. {
  55. Noise* a = parseNoise(zConfig->asObject()->zValue("noise"), zMemory);
  56. double factor
  57. = zConfig->asObject()->zValue("factor")->asNumber()->getNumber();
  58. return new ScaleNoise(a, factor);
  59. }
  60. else
  61. {
  62. JFloatExpression* seedExpression
  63. = Game::INSTANCE->zTypeRegistry()->fromJson<JFloatExpression>(
  64. zConfig->asObject()->zValue("seed"));
  65. seedExpression->compile(zMemory);
  66. float seed = seedExpression->getValue();
  67. seedExpression->release();
  68. FastNoiseLite* noise = new FastNoiseLite((int)(round(seed)));
  69. if (type.istGleich("Cellular"))
  70. noise->SetNoiseType(FastNoiseLite::NoiseType::NoiseType_Cellular);
  71. else if (type.istGleich("ValueCubic"))
  72. noise->SetNoiseType(FastNoiseLite::NoiseType::NoiseType_ValueCubic);
  73. else if (type.istGleich("Perlin"))
  74. noise->SetNoiseType(FastNoiseLite::NoiseType::NoiseType_Perlin);
  75. else if (type.istGleich("OpenSimplex2S"))
  76. noise->SetNoiseType(
  77. FastNoiseLite::NoiseType::NoiseType_OpenSimplex2S);
  78. else if (type.istGleich("OpenSimplex2"))
  79. noise->SetNoiseType(
  80. FastNoiseLite::NoiseType::NoiseType_OpenSimplex2);
  81. else if (type.istGleich("Value"))
  82. noise->SetNoiseType(FastNoiseLite::NoiseType::NoiseType_Value);
  83. if (zConfig->asObject()->hasValue("rotationType3D"))
  84. {
  85. Text value = zConfig->asObject()
  86. ->zValue("rotationType3D")
  87. ->asString()
  88. ->getString();
  89. if (value.istGleich("None"))
  90. {
  91. noise->SetRotationType3D(
  92. FastNoiseLite::RotationType3D::RotationType3D_None);
  93. }
  94. else if (value.istGleich("ImproveXYPlanes"))
  95. {
  96. noise->SetRotationType3D(FastNoiseLite::RotationType3D::
  97. RotationType3D_ImproveXYPlanes);
  98. }
  99. else if (value.istGleich("ImproveXZPlanes"))
  100. {
  101. noise->SetRotationType3D(FastNoiseLite::RotationType3D::
  102. RotationType3D_ImproveXZPlanes);
  103. }
  104. }
  105. if (zConfig->asObject()->hasValue("frequency"))
  106. {
  107. noise->SetFrequency((float)zConfig->asObject()
  108. ->zValue("frequency")
  109. ->asNumber()
  110. ->getNumber());
  111. }
  112. if (zConfig->asObject()->hasValue("fractalType"))
  113. {
  114. Text value = zConfig->asObject()
  115. ->zValue("fractalType")
  116. ->asString()
  117. ->getString();
  118. if (value.istGleich("None"))
  119. {
  120. noise->SetFractalType(
  121. FastNoiseLite::FractalType::FractalType_None);
  122. }
  123. else if (value.istGleich("FBm"))
  124. {
  125. noise->SetFractalType(
  126. FastNoiseLite::FractalType::FractalType_FBm);
  127. }
  128. else if (value.istGleich("Ridged"))
  129. {
  130. noise->SetFractalType(
  131. FastNoiseLite::FractalType::FractalType_Ridged);
  132. }
  133. else if (value.istGleich("PingPong"))
  134. {
  135. noise->SetFractalType(
  136. FastNoiseLite::FractalType::FractalType_PingPong);
  137. }
  138. else if (value.istGleich("DomainWarpProgressive"))
  139. {
  140. noise->SetFractalType(FastNoiseLite::FractalType::
  141. FractalType_DomainWarpProgressive);
  142. }
  143. else if (value.istGleich("DomainWarpIndependent"))
  144. {
  145. noise->SetFractalType(FastNoiseLite::FractalType::
  146. FractalType_DomainWarpIndependent);
  147. }
  148. }
  149. if (zConfig->asObject()->hasValue("fractalOctaves"))
  150. {
  151. noise->SetFractalOctaves((int)round(zConfig->asObject()
  152. ->zValue("fractalOctaves")
  153. ->asNumber()
  154. ->getNumber()));
  155. }
  156. if (zConfig->asObject()->hasValue("fractalLacunarity"))
  157. {
  158. noise->SetFractalLacunarity((float)zConfig->asObject()
  159. ->zValue("fractalLacunarity")
  160. ->asNumber()
  161. ->getNumber());
  162. }
  163. if (zConfig->asObject()->hasValue("fractalGain"))
  164. {
  165. noise->SetFractalGain((float)zConfig->asObject()
  166. ->zValue("fractalGain")
  167. ->asNumber()
  168. ->getNumber());
  169. }
  170. if (zConfig->asObject()->hasValue("cellularDistanceFunction"))
  171. {
  172. Text value = zConfig->asObject()
  173. ->zValue("cellularDistanceFunction")
  174. ->asString()
  175. ->getString();
  176. if (value.istGleich("Hybrid"))
  177. {
  178. noise->SetCellularDistanceFunction(
  179. FastNoiseLite::CellularDistanceFunction::
  180. CellularDistanceFunction_Hybrid);
  181. }
  182. else if (value.istGleich("Manhattan"))
  183. {
  184. noise->SetCellularDistanceFunction(
  185. FastNoiseLite::CellularDistanceFunction::
  186. CellularDistanceFunction_Manhattan);
  187. }
  188. else if (value.istGleich("EuclideanSq"))
  189. {
  190. noise->SetCellularDistanceFunction(
  191. FastNoiseLite::CellularDistanceFunction::
  192. CellularDistanceFunction_EuclideanSq);
  193. }
  194. else if (value.istGleich("Euclidean"))
  195. {
  196. noise->SetCellularDistanceFunction(
  197. FastNoiseLite::CellularDistanceFunction::
  198. CellularDistanceFunction_Euclidean);
  199. }
  200. }
  201. if (zConfig->asObject()->hasValue("cellularReturnType"))
  202. {
  203. Text value = zConfig->asObject()
  204. ->zValue("cellularReturnType")
  205. ->asString()
  206. ->getString();
  207. if (value.istGleich("CellValue"))
  208. {
  209. noise->SetCellularReturnType(FastNoiseLite::CellularReturnType::
  210. CellularReturnType_CellValue);
  211. }
  212. else if (value.istGleich("Distance"))
  213. {
  214. noise->SetCellularReturnType(FastNoiseLite::CellularReturnType::
  215. CellularReturnType_Distance);
  216. }
  217. else if (value.istGleich("Distance2"))
  218. {
  219. noise->SetCellularReturnType(FastNoiseLite::CellularReturnType::
  220. CellularReturnType_Distance2);
  221. }
  222. else if (value.istGleich("Distance2Add"))
  223. {
  224. noise->SetCellularReturnType(FastNoiseLite::CellularReturnType::
  225. CellularReturnType_Distance2Add);
  226. }
  227. else if (value.istGleich("Distance2Sub"))
  228. {
  229. noise->SetCellularReturnType(FastNoiseLite::CellularReturnType::
  230. CellularReturnType_Distance2Sub);
  231. }
  232. else if (value.istGleich("Distance2Mul"))
  233. {
  234. noise->SetCellularReturnType(FastNoiseLite::CellularReturnType::
  235. CellularReturnType_Distance2Mul);
  236. }
  237. else if (value.istGleich("Distance2Div"))
  238. {
  239. noise->SetCellularReturnType(FastNoiseLite::CellularReturnType::
  240. CellularReturnType_Distance2Div);
  241. }
  242. }
  243. if (zConfig->asObject()->hasValue("cellularJitter"))
  244. {
  245. noise->SetCellularJitter((float)zConfig->asObject()
  246. ->zValue("cellularJitter")
  247. ->asNumber()
  248. ->getNumber());
  249. }
  250. if (zConfig->asObject()->hasValue("domainWarpType"))
  251. {
  252. Text value = zConfig->asObject()
  253. ->zValue("domainWarpType")
  254. ->asString()
  255. ->getString();
  256. if (value.istGleich("OpenSimplex2Reduced"))
  257. {
  258. noise->SetDomainWarpType(FastNoiseLite::DomainWarpType::
  259. DomainWarpType_OpenSimplex2Reduced);
  260. }
  261. else if (value.istGleich("OpenSimplex2"))
  262. {
  263. noise->SetDomainWarpType(
  264. FastNoiseLite::DomainWarpType::DomainWarpType_OpenSimplex2);
  265. }
  266. else if (value.istGleich("BasicGrid"))
  267. {
  268. noise->SetDomainWarpType(
  269. FastNoiseLite::DomainWarpType::DomainWarpType_BasicGrid);
  270. }
  271. }
  272. if (zConfig->asObject()->hasValue("domainWarpAmp"))
  273. {
  274. noise->SetDomainWarpAmp((float)zConfig->asObject()
  275. ->zValue("domainWarpAmp")
  276. ->asNumber()
  277. ->getNumber());
  278. }
  279. FastNoiseWrapper* result
  280. = new FastNoiseWrapper(noise, (int)(round(seed)));
  281. if (zConfig->asObject()->hasValue("multiplier"))
  282. {
  283. result->setMultiplier((float)zConfig->asObject()
  284. ->zValue("multiplier")
  285. ->asNumber()
  286. ->getNumber());
  287. }
  288. return result;
  289. }
  290. return 0;
  291. }
  292. Validator::DataValidator* JNoise::getValidator(bool optional)
  293. {
  294. auto validator1 = Validator::DataValidator::buildForObject();
  295. auto validator2 = Validator::DataValidator::buildForObject();
  296. auto validator3 = Validator::DataValidator::buildForObject();
  297. auto validator4 = Validator::DataValidator::buildForObject();
  298. auto validator5 = Validator::DataValidator::buildForObject();
  299. auto validator6 = Validator::DataValidator::buildForObject();
  300. auto validator7 = Validator::DataValidator::buildForObject();
  301. if (optional)
  302. {
  303. validator1 = validator1->whichIsOptional();
  304. validator2 = validator2->whichIsOptional();
  305. validator3 = validator3->whichIsOptional();
  306. validator4 = validator4->whichIsOptional();
  307. validator5 = validator5->whichIsOptional();
  308. validator6 = validator6->whichIsOptional();
  309. validator7 = validator7->whichIsOptional();
  310. }
  311. Validator::DataValidator* refs
  312. = Validator::DataValidator::buildForOneOf()
  313. ->typeSpecifiedByAttribute("type")
  314. ->addAcceptedType(
  315. Validator::DataValidator::buildForReference("jn_random"))
  316. ->addAcceptedType(
  317. Validator::DataValidator::buildForReference("jn_factorize"))
  318. ->addAcceptedType(
  319. Validator::DataValidator::buildForReference("jn_multiply"))
  320. ->addAcceptedType(
  321. Validator::DataValidator::buildForReference("jn_negate"))
  322. ->addAcceptedType(
  323. Validator::DataValidator::buildForReference("jn_flatten"))
  324. ->addAcceptedType(
  325. Validator::DataValidator::buildForReference("jn_scale"))
  326. ->addAcceptedType(Validator::DataValidator::buildForReference(
  327. "jn_fastNoiseLite"))
  328. ->finishOneOf();
  329. return Validator::DataValidator::buildForOneOf()
  330. ->typeSpecifiedByAttribute("type")
  331. ->addAcceptedType(validator1->setReferenceId("jn_random")
  332. ->withRequiredString("type")
  333. ->withExactMatch("random")
  334. ->finishString()
  335. ->withRequiredAttribute("seed",
  336. Game::INSTANCE->zTypeRegistry()
  337. ->getValidator<JFloatExpression>())
  338. ->finishObject())
  339. ->addAcceptedType(validator2->setReferenceId("jn_factorize")
  340. ->withRequiredString("type")
  341. ->withExactMatch("factorize")
  342. ->finishString()
  343. ->withRequiredNumber("factorA")
  344. ->whichIsGreaterThen(0)
  345. ->whichIsLessThen(1)
  346. ->finishNumber()
  347. ->withRequiredAttribute("noiseA",
  348. dynamic_cast<Validator::DataValidator*>(refs->getThis()))
  349. ->withRequiredAttribute("noiseB",
  350. dynamic_cast<Validator::DataValidator*>(refs->getThis()))
  351. ->finishObject())
  352. ->addAcceptedType(validator3->setReferenceId("jn_multiply")
  353. ->withRequiredString("type")
  354. ->withExactMatch("multiply")
  355. ->finishString()
  356. ->withRequiredAttribute("base",
  357. dynamic_cast<Validator::DataValidator*>(refs->getThis()))
  358. ->withRequiredAttribute("multiplier",
  359. dynamic_cast<Validator::DataValidator*>(refs->getThis()))
  360. ->finishObject())
  361. ->addAcceptedType(validator4->setReferenceId("jn_negate")
  362. ->withRequiredString("type")
  363. ->withExactMatch("negate")
  364. ->finishString()
  365. ->withRequiredAttribute("noise",
  366. dynamic_cast<Validator::DataValidator*>(refs->getThis()))
  367. ->finishObject())
  368. ->addAcceptedType(validator5->setReferenceId("jn_flatten")
  369. ->withRequiredString("type")
  370. ->withExactMatch("flatten")
  371. ->finishString()
  372. ->withRequiredAttribute("noise",
  373. dynamic_cast<Validator::DataValidator*>(refs->getThis()))
  374. ->withRequiredNumber("factor")
  375. ->withDefault(1.0)
  376. ->finishNumber()
  377. ->withRequiredNumber("addition")
  378. ->withDefault(0.0)
  379. ->finishNumber()
  380. ->finishObject())
  381. ->addAcceptedType(validator6->setReferenceId("jn_scale")
  382. ->withRequiredString("type")
  383. ->withExactMatch("scale")
  384. ->finishString()
  385. ->withRequiredAttribute("noise",
  386. dynamic_cast<Validator::DataValidator*>(refs->getThis()))
  387. ->withRequiredNumber("factor")
  388. ->finishNumber()
  389. ->finishObject())
  390. ->addAcceptedType(validator7->setReferenceId("jn_fastNoiseLite")
  391. ->withRequiredString("type")
  392. ->whichIsOneOf({"Cellular",
  393. "ValueCubic",
  394. "Perlin",
  395. "OpenSimplex2S",
  396. "OpenSimplex2",
  397. "Value"})
  398. ->finishString()
  399. ->withRequiredAttribute("seed",
  400. Game::INSTANCE->zTypeRegistry()
  401. ->getValidator<JFloatExpression>())
  402. ->withRequiredString("rotationType3D")
  403. ->whichIsOptional()
  404. ->whichIsOneOf({"None", "ImproveXYPlanes", "ImproveXZPlanes"})
  405. ->finishString()
  406. ->withRequiredNumber("frequency")
  407. ->whichIsOptional()
  408. ->finishNumber()
  409. ->withRequiredString("fractalType")
  410. ->whichIsOptional()
  411. ->whichIsOneOf({"None",
  412. "FBm",
  413. "Ridged",
  414. "PingPong",
  415. "DomainWarpProgressive",
  416. "DomainWarpIndependent"})
  417. ->finishString()
  418. ->withRequiredNumber("fractalOctaves")
  419. ->whichIsOptional()
  420. ->finishNumber()
  421. ->withRequiredNumber("fractalLacunarity")
  422. ->whichIsOptional()
  423. ->finishNumber()
  424. ->withRequiredNumber("fractalGain")
  425. ->whichIsOptional()
  426. ->finishNumber()
  427. ->withRequiredString("cellularDistanceFunction")
  428. ->whichIsOptional()
  429. ->whichIsOneOf(
  430. {"Hybrid", "Manhattan", "EuclideanSq", "Euclidean"})
  431. ->finishString()
  432. ->withRequiredString("cellularReturnType")
  433. ->whichIsOptional()
  434. ->whichIsOneOf({"CellValue",
  435. "Distance",
  436. "Distance2",
  437. "Distance2Add",
  438. "Distance2Sub",
  439. "Distance2Mul",
  440. "Distance2Div"})
  441. ->finishString()
  442. ->withRequiredNumber("cellularJitter")
  443. ->whichIsOptional()
  444. ->finishNumber()
  445. ->withRequiredString("domainWarpType")
  446. ->whichIsOptional()
  447. ->whichIsOneOf(
  448. {"BasicGrid", "OpenSimplex2", "OpenSimplex2Reduced"})
  449. ->finishString()
  450. ->withRequiredNumber("domainWarpAmp")
  451. ->whichIsOptional()
  452. ->finishNumber()
  453. ->withRequiredNumber("multiplier")
  454. ->whichIsOptional()
  455. ->whichIsGreaterThen(0)
  456. ->finishNumber()
  457. ->finishObject())
  458. ->finishOneOf();
  459. }