From 98e2086a7e665e1271ac6cfdae923caf7b2a1048 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Barth=C3=A9lemy?= <31370477+BarthPaleologue@users.noreply.github.com> Date: Sat, 13 Jan 2024 19:21:16 +0100 Subject: [PATCH] added butterflies on habitable planets --- src/asset/butterfly.png | Bin 0 -> 52555 bytes .../butterflyMaterial/butterflyFragment.glsl | 59 +++++++++++ .../butterflyMaterial/butterflyVertex.glsl | 78 +++++++++++++++ .../terrain/chunks/planetChunk.ts | 9 +- .../terrain/workers/buildScript.ts | 2 +- .../proceduralAssets/butterfly/butterfly.ts | 92 ++++++++++++++++++ .../butterfly/butterflyMaterial.ts | 46 +++++++++ 7 files changed, 283 insertions(+), 3 deletions(-) create mode 100644 src/asset/butterfly.png create mode 100644 src/shaders/butterflyMaterial/butterflyFragment.glsl create mode 100644 src/shaders/butterflyMaterial/butterflyVertex.glsl create mode 100644 src/ts/proceduralAssets/butterfly/butterfly.ts create mode 100644 src/ts/proceduralAssets/butterfly/butterflyMaterial.ts diff --git a/src/asset/butterfly.png b/src/asset/butterfly.png new file mode 100644 index 0000000000000000000000000000000000000000..6818b4157ae767ac64de54fff26d55e2f6308028 GIT binary patch literal 52555 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 literal 0 HcmV?d00001 diff --git a/src/shaders/butterflyMaterial/butterflyFragment.glsl b/src/shaders/butterflyMaterial/butterflyFragment.glsl new file mode 100644 index 000000000..9071c4f77 --- /dev/null +++ b/src/shaders/butterflyMaterial/butterflyFragment.glsl @@ -0,0 +1,59 @@ +precision highp float; + +uniform float time; + +uniform vec3 lightDirection; + +uniform sampler2D butterflyTexture; + +varying vec3 vPosition; +varying vec2 vUV; + +varying mat4 normalMatrix; +varying vec3 vNormal; + +varying vec3 vOriginalWorldPosition; + +// src: https://gist.github.com/mairod/a75e7b44f68110e1576d77419d608786 +vec3 hueShift( vec3 color, float hueAdjust ){ + const vec3 kRGBToYPrime = vec3 (0.299, 0.587, 0.114); + const vec3 kRGBToI = vec3 (0.596, -0.275, -0.321); + const vec3 kRGBToQ = vec3 (0.212, -0.523, 0.311); + + const vec3 kYIQToR = vec3 (1.0, 0.956, 0.621); + const vec3 kYIQToG = vec3 (1.0, -0.272, -0.647); + const vec3 kYIQToB = vec3 (1.0, -1.107, 1.704); + + float YPrime = dot (color, kRGBToYPrime); + float I = dot (color, kRGBToI); + float Q = dot (color, kRGBToQ); + float hue = atan (Q, I); + float chroma = sqrt (I * I + Q * Q); + + hue += hueAdjust; + + Q = chroma * sin (hue); + I = chroma * cos (hue); + + vec3 yIQ = vec3 (YPrime, I, Q); + + return vec3( dot (yIQ, kYIQToR), dot (yIQ, kYIQToG), dot (yIQ, kYIQToB) ); +} + +void main() { + vec4 finalColor = texture(butterflyTexture, vUV); + if(finalColor.a < 0.1) discard; + + finalColor.rgb = hueShift(finalColor.rgb, vOriginalWorldPosition.x * 10.0 + vOriginalWorldPosition.z * 10.0); + + vec3 normalW = normalize((normalMatrix * vec4(vNormal, 0.0)).xyz); + + float ndl1 = max(dot(normalW, lightDirection), 0.0); + float ndl2 = max(dot(-normalW, lightDirection), 0.0); + float ndl = ndl1 + ndl2; + + // ambient lighting + ndl = clamp(ndl + 0.1, 0.0, 1.0); + + gl_FragColor = vec4(finalColor.rgb * ndl, 1.0);// apply color and lighting +} \ No newline at end of file diff --git a/src/shaders/butterflyMaterial/butterflyVertex.glsl b/src/shaders/butterflyMaterial/butterflyVertex.glsl new file mode 100644 index 000000000..599fc5112 --- /dev/null +++ b/src/shaders/butterflyMaterial/butterflyVertex.glsl @@ -0,0 +1,78 @@ +precision highp float; + +attribute vec3 position; +attribute vec3 normal; +attribute vec2 uv; + +uniform mat4 viewProjection; + +//uniform mat4 world; + +uniform vec3 playerPosition; + +uniform float time; + +varying vec3 vPosition; +varying vec2 vUV; + +varying mat4 normalMatrix; +varying vec3 vNormal; + +varying vec3 vOriginalWorldPosition; + +#include "../utils/rotateAround.glsl"; + +float easeOut(float t, float a) { + return 1.0 - pow(1.0 - t, a); +} + +float easeIn(float t, float alpha) { + return pow(t, alpha); +} + +#include "../utils/remap.glsl"; + +#include + +void main() { + #include + + vec3 objectWorld = vec3(finalWorld[3].x, finalWorld[3].y, finalWorld[3].z); + vOriginalWorldPosition = objectWorld; + + // high frequency movement for wing flap + objectWorld.y += 0.1 * sin(5.0 * time + objectWorld.x * 10.0 + objectWorld.z * 10.0); + // low frequency movement of larger amplitude for general movement + objectWorld.y += 0.5 * sin(0.2 * time + objectWorld.x * 15.0 + objectWorld.z * 15.0); + + vec3 butterflyForward = vec3(1.0, 0.0, 0.0); + + float rotationY = sin(0.5 * time + vOriginalWorldPosition.x * 10.0 + vOriginalWorldPosition.z * 10.0) * 3.14; + vec3 rotatedPosition = rotateAround(position, vec3(0.0, 1.0, 0.0), rotationY); + butterflyForward = rotateAround(butterflyForward, vec3(0.0, 1.0, 0.0), rotationY); + + vec3 flyPosition = rotateAround(rotatedPosition, butterflyForward, sign(position.z) * cos(10.0 * time + objectWorld.x * 10.0 + objectWorld.z * 10.0)); + flyPosition.y += 3.0; + + objectWorld += butterflyForward * 0.5 * sin(0.5 * time + vOriginalWorldPosition.x * 10.0 + vOriginalWorldPosition.z * 10.0); + + // avoid the player + vec3 playerToButterfly = objectWorld - playerPosition; + playerToButterfly.y = 0.0; + float distanceToPlayer = length(playerToButterfly); + if (distanceToPlayer < 2.0) { + objectWorld += normalize(playerToButterfly) * (2.0 - distanceToPlayer); + } + + finalWorld[3].xyz = objectWorld; + + vec4 outPosition = viewProjection * finalWorld * vec4(flyPosition, 1.0); + gl_Position = outPosition; + + vPosition = flyPosition; + vUV = uv; + + normalMatrix = transpose(inverse(finalWorld)); + + vNormal = normal; +} \ No newline at end of file diff --git a/src/ts/planemos/telluricPlanemo/terrain/chunks/planetChunk.ts b/src/ts/planemos/telluricPlanemo/terrain/chunks/planetChunk.ts index 4410f7078..33a4e1ec6 100644 --- a/src/ts/planemos/telluricPlanemo/terrain/chunks/planetChunk.ts +++ b/src/ts/planemos/telluricPlanemo/terrain/chunks/planetChunk.ts @@ -19,6 +19,7 @@ import { Camera } from "@babylonjs/core/Cameras/camera"; import { IPatch } from "../instancePatch/iPatch"; import { createGrassBlade } from "../../../../proceduralAssets/grass/grassBlade"; import { TelluricPlanemoModel } from "../../telluricPlanemoModel"; +import { createButterfly } from "../../../../proceduralAssets/butterfly/butterfly"; export class PlanetChunk implements Transformable { public readonly mesh: Mesh; @@ -134,15 +135,19 @@ export class PlanetChunk implements Transformable { this.onRecieveVertexDataObservable.notifyObservers(); - const rockPatch = new ThinInstancePatch(this.parent, randomDownSample(alignedInstancesMatrixBuffer, 2)); + const rockPatch = new ThinInstancePatch(this.parent, randomDownSample(alignedInstancesMatrixBuffer, 4)); rockPatch.createInstances(Assets.Rock); this.instancePatches.push(rockPatch); if(this.planetModel.physicalProperties.pressure > 0 && this.planetModel.physicalProperties.oceanLevel > 0) { - const treePatch = new ThinInstancePatch(this.parent, randomDownSample(instancesMatrixBuffer, 3)); + const treePatch = new ThinInstancePatch(this.parent, randomDownSample(instancesMatrixBuffer, 6)); treePatch.createInstances(Assets.Tree); this.instancePatches.push(treePatch); + const butterflyPatch = new ThinInstancePatch(this.parent, instancesMatrixBuffer); + butterflyPatch.createInstances(createButterfly(this.mesh.getScene())); + this.instancePatches.push(butterflyPatch); + /*const grassPatch = new ThinInstancePatch(this.parent, instancesMatrixBuffer); grassPatch.createInstances(createGrassBlade(this.mesh.getScene(), 3)); this.instancePatches.push(grassPatch);*/ diff --git a/src/ts/planemos/telluricPlanemo/terrain/workers/buildScript.ts b/src/ts/planemos/telluricPlanemo/terrain/workers/buildScript.ts index 71be21e69..946f730fd 100644 --- a/src/ts/planemos/telluricPlanemo/terrain/workers/buildScript.ts +++ b/src/ts/planemos/telluricPlanemo/terrain/workers/buildScript.ts @@ -14,7 +14,7 @@ function handle_build(data: TransferBuildData): void { const size = data.planetDiameter / 2 ** data.depth; const space_between_vertices = size / nbSubdivisions; //console.log(data.depth, space_between_vertices); - const scatter_per_square_meter = space_between_vertices < Settings.MIN_DISTANCE_BETWEEN_VERTICES ? 0.01 : 0; + const scatter_per_square_meter = space_between_vertices < Settings.MIN_DISTANCE_BETWEEN_VERTICES ? 0.02 : 0; const flat_area = size * size; const max_nb_instances = Math.floor(flat_area * scatter_per_square_meter * 2.0); diff --git a/src/ts/proceduralAssets/butterfly/butterfly.ts b/src/ts/proceduralAssets/butterfly/butterfly.ts new file mode 100644 index 000000000..765861f58 --- /dev/null +++ b/src/ts/proceduralAssets/butterfly/butterfly.ts @@ -0,0 +1,92 @@ +import { VertexData } from "@babylonjs/core/Meshes/mesh.vertexData"; +import { Mesh } from "@babylonjs/core/Meshes/mesh"; +import { Scene } from "@babylonjs/core/scene"; +import { createButterflyMaterial } from "./butterflyMaterial"; + +export function createButterfly(scene: Scene) { + const positions = new Float32Array(6 * 3); + const indices = new Uint32Array(4 * 3); + const uvs = new Float32Array(6 * 2); + + // butter fly is made of 4 triangles (2 squares touching each other) + // 0--1 + // | /| + // |/ | + // 2--3 + positions[0] = 0; + positions[1] = 0; + positions[2] = -1; + + positions[3] = 1; + positions[4] = 0; + positions[5] = -1; + + positions[6] = 0; + positions[7] = 0.0; + positions[8] = 0.0; + + positions[9] = 1; + positions[10] = 0; + positions[11] = 0; + + positions[12] = 0; + positions[13] = 0; + positions[14] = 1; + + positions[15] = 1; + positions[16] = 0; + positions[17] = 1; + + // first square + indices[0] = 0; + indices[1] = 1; + indices[2] = 2; + + indices[3] = 1; + indices[4] = 3; + indices[5] = 2; + + // second square + indices[6] = 2; + indices[7] = 3; + indices[8] = 4; + + indices[9] = 3; + indices[10] = 5; + indices[11] = 4; + + // uvs (0,0) is bottom left, (1,1) is top right + uvs[0] = 0; + uvs[1] = 0; + + uvs[2] = 0; + uvs[3] = 1; + + uvs[4] = 0.5; + uvs[5] = 0; + + uvs[6] = 0.5; + uvs[7] = 1; + + uvs[8] = 1; + uvs[9] = 0; + + uvs[10] = 1; + uvs[11] = 1; + + const vertexData = new VertexData(); + vertexData.positions = positions; + vertexData.indices = indices; + vertexData.uvs = uvs; + + const mesh = new Mesh("butterfly", scene); + vertexData.applyToMesh(mesh); + mesh.createNormals(false); + + mesh.scaling.scaleInPlace(0.2); + mesh.bakeCurrentTransformIntoVertices(); + + mesh.material = createButterflyMaterial(scene); + + return mesh; +} diff --git a/src/ts/proceduralAssets/butterfly/butterflyMaterial.ts b/src/ts/proceduralAssets/butterfly/butterflyMaterial.ts new file mode 100644 index 000000000..9454e19b3 --- /dev/null +++ b/src/ts/proceduralAssets/butterfly/butterflyMaterial.ts @@ -0,0 +1,46 @@ +import { Scene } from "@babylonjs/core/scene"; +import { Effect } from "@babylonjs/core/Materials/effect"; +import { ShaderMaterial } from "@babylonjs/core/Materials/shaderMaterial"; +import butterflyFragment from "../../../shaders/butterflyMaterial/butterflyFragment.glsl"; +import butterflyVertex from "../../../shaders/butterflyMaterial/butterflyVertex.glsl"; + +import butterflyTexture from "../../../asset/butterfly.png"; +import { Texture } from "@babylonjs/core/Materials/Textures/texture"; +import { TransformNode } from "@babylonjs/core/Meshes/transformNode"; +import { Vector3 } from "@babylonjs/core/Maths/math.vector"; +import { PointLight } from "@babylonjs/core/Lights/pointLight"; + +export function createButterflyMaterial(scene: Scene, player?: TransformNode) { + const shaderName = "butterflyMaterial"; + Effect.ShadersStore[`${shaderName}FragmentShader`] = butterflyFragment; + Effect.ShadersStore[`${shaderName}VertexShader`] = butterflyVertex; + + const butterflyMaterial = new ShaderMaterial(shaderName, scene, shaderName, { + attributes: ["position", "normal", "uv"], + uniforms: ["world", "worldView", "worldViewProjection", "view", "projection", "viewProjection", "time", "lightDirection", "playerPosition"], + defines: ["#define INSTANCES"], + samplers: ["butterflyTexture"] + }); + + butterflyMaterial.setTexture("butterflyTexture", new Texture(butterflyTexture, scene)); + butterflyMaterial.backFaceCulling = false; + + let elapsedSeconds = 0; + scene.onBeforeRenderObservable.add(() => { + elapsedSeconds += scene.getEngine().getDeltaTime() / 1000; + + if(scene.activeCamera === null) throw new Error("Active camera is null"); + + const star = scene.lights[1]; + if(!(star instanceof PointLight)) throw new Error("Could not find star light"); + + const lightDirection = star.position.subtract(scene.activeCamera.globalPosition).normalize(); + butterflyMaterial.setVector3("lightDirection", lightDirection); + + const playerPosition = player?.position ?? new Vector3(0, 0, 0); + butterflyMaterial.setVector3("playerPosition", playerPosition); + butterflyMaterial.setFloat("time", elapsedSeconds); + }); + + return butterflyMaterial; +}