333{
334 if (appState->mode == ApplicationMode::TERRAIN)
335 {
336 if (appState->models.coreTerrain->mesh->res != appState->globals.resolution || appState->models.coreTerrain->mesh->sc != appState->globals.scale)
337 {
338 appState->models.coreTerrain->mesh->res = appState->globals.resolution;
339 appState->models.coreTerrain->mesh->sc = appState->globals.scale;
340 appState->models.coreTerrain->mesh->GeneratePlane(appState->globals.resolution, appState->globals.scale);
341 }
342
343 kernels->CreateBuffer(
"mesh", CL_MEM_READ_WRITE, appState->models.coreTerrain->mesh->vertexCount *
sizeof(
Vert));
344 kernels->WriteBuffer(
"mesh",
true, appState->models.coreTerrain->mesh->vertexCount *
sizeof(
Vert), appState->models.coreTerrain->mesh->vert);
345
346 if(clearMeshGen->useGPU)
347 {
348 clearMeshGen->Generate(kernels);
349 }
350
351 for (int i = 0; i < gpuNoiseLayers.size(); i++)
352 {
353 if (gpuNoiseLayers[i]->enabled)
354 {
355 gpuNoiseLayers[i]->Generate(kernels);
356 }
357 }
358
359 if(clearMeshGen->useGPUForNormals)
360 {
361 kernels->CreateBuffer("indices", CL_MEM_READ_WRITE, appState->models.coreTerrain->mesh->indexCount * sizeof(int));
362 kernels->WriteBuffer("indices", true, appState->models.coreTerrain->mesh->indexCount * sizeof(int), appState->models.coreTerrain->mesh->indices);
363 kernels->SetKernelArg("gen_normals", 0, "mesh");
364 kernels->SetKernelArg("gen_normals", 1, "indices");
365 int ls = 512;
366 int ic = appState->models.coreTerrain->mesh->indexCount;
367
368 while(ic % ls != 0)
369 {
370 ls /= 2;
371 }
372
373 kernels->ExecuteKernel("gen_normals", cl::NDRange(ls), cl::NDRange(ic));
374 kernels->SetKernelArg("normalize_normals", 0, "mesh");
375 kernels->ExecuteKernel("normalize_normals", cl::NDRange(1), cl::NDRange(appState->models.coreTerrain->mesh->vertexCount));
376 }
377
378 kernels->ReadBuffer(
"mesh",
true, appState->models.coreTerrain->mesh->vertexCount *
sizeof(
Vert), appState->models.coreTerrain->mesh->vert);
379 }
380
381 else if (appState->mode == ApplicationMode::CUSTOM_BASE)
382 {
383 kernels->CreateBuffer(
"mesh", CL_MEM_READ_WRITE, appState->models.customBase->mesh->vertexCount *
sizeof(
Vert));
384 kernels->WriteBuffer(
"mesh",
true, appState->models.customBase->mesh->vertexCount *
sizeof(
Vert), appState->models.customBase->mesh->vert);
385 kernels->CreateBuffer(
"mesh_copy", CL_MEM_READ_WRITE, appState->models.customBase->mesh->vertexCount *
sizeof(
Vert));
386 kernels->WriteBuffer(
"mesh_copy",
true, appState->models.customBase->mesh->vertexCount *
sizeof(
Vert), appState->models.customBaseCopy->mesh->vert);
387
388 if(clearMeshGen->useGPU)
389 {
390 clearMeshGen->Generate(kernels);
391 }
392
393 for (int i = 0; i < gpuNoiseLayers.size(); i++)
394 {
395 if (gpuNoiseLayers[i]->enabled)
396 {
397 gpuNoiseLayers[i]->Generate(kernels);
398 }
399 }
400
401 if(clearMeshGen->useGPUForNormals)
402 {
403 kernels->CreateBuffer("indices", CL_MEM_READ_WRITE, appState->models.customBase->mesh->indexCount * sizeof(int));
404 kernels->WriteBuffer("indices", true, appState->models.customBase->mesh->indexCount * sizeof(int), appState->models.customBase->mesh->indices);
405 kernels->SetKernelArg("gen_normals", 0, "mesh");
406 kernels->SetKernelArg("gen_normals", 1, "indices");
407 int ls = 512;
408 int ic = appState->models.customBase->mesh->indexCount;
409
410 while(ic % ls != 0)
411 {
412 ls /= 2;
413 }
414
415 kernels->ExecuteKernel("gen_normals", cl::NDRange(ls), cl::NDRange(ic));
416 kernels->SetKernelArg("normalize_normals", 0, "mesh");
417 kernels->ExecuteKernel("normalize_normals", cl::NDRange(1), cl::NDRange(appState->models.customBase->mesh->vertexCount));
418 }
419
420 kernels->ReadBuffer(
"mesh",
true, appState->models.customBase->mesh->vertexCount *
sizeof(
Vert), appState->models.customBase->mesh->vert);
421 }
422}