Working on fog, 2nd level, locations, dialogs

This commit is contained in:
Vladislav Khorev 2026-04-25 19:56:00 +03:00
parent eac914e073
commit c7b3f04cd4
38 changed files with 150471 additions and 145 deletions

View File

@ -0,0 +1,160 @@
{
"objects": [
{
"name": "door",
"texturePath": "resources/w/exterior/door002.png",
"meshPath": "resources/w/exterior/door002.txt",
"rotationX": 0.0,
"rotationY": 0.0,
"rotationZ": 0.0,
"positionX": 0.0,
"positionY": 0.0,
"positionZ": 0.0,
"scale": 1.0,
"interactive": false
},
{
"name": "inai",
"texturePath": "resources/w/exterior/Main_Building.png",
"meshPath": "resources/w/exterior/Main_Building.txt",
"rotationX": 0.0,
"rotationY": 0.0,
"rotationZ": 0.0,
"positionX": 0.0,
"positionY": 0.0,
"positionZ": 0.0,
"scale": 1.0,
"interactive": false
},
{
"name": "tree001",
"texturePath": "resources/w/exterior/tree001.png",
"meshPath": "resources/w/exterior/tree002.txt",
"rotationX": 0.0,
"rotationY": -1.5707963267948966,
"rotationZ": 0.0,
"positionX": 10.0,
"positionY": 0.0,
"positionZ": 12.0,
"scale": 1.0,
"interactive": false
},
{
"name": "tree002",
"texturePath": "resources/w/exterior/tree001.png",
"meshPath": "resources/w/exterior/tree002.txt",
"rotationX": 0.0,
"rotationY": 1.5707963267948966,
"rotationZ": 0.0,
"positionX": -12,
"positionY": 0.0,
"positionZ": 19.0,
"scale": 1.0,
"interactive": false
},
{
"name": "tree003",
"texturePath": "resources/w/exterior/tree001.png",
"meshPath": "resources/w/exterior/tree002.txt",
"rotationX": 0.0,
"rotationY": 0.0,
"rotationZ": 0.0,
"positionX": -12.0,
"positionY": 0.0,
"positionZ": 8.0,
"scale": 1.0,
"interactive": false
},
{
"name": "tree004",
"texturePath": "resources/w/exterior/tree001.png",
"meshPath": "resources/w/exterior/tree002.txt",
"rotationX": 0.0,
"rotationY": -1.5707963267948966,
"rotationZ": 0.0,
"positionX": -12.0,
"positionY": 0.0,
"positionZ": 0.0,
"scale": 1.0,
"interactive": false
},
{
"name": "tree005",
"texturePath": "resources/w/exterior/tree001.png",
"meshPath": "resources/w/exterior/tree002.txt",
"rotationX": 0.0,
"rotationY": 1.5707963267948966,
"rotationZ": 0.0,
"positionX": -12.0,
"positionY": 0.0,
"positionZ": -8.0,
"scale": 1.0,
"interactive": false
},
{
"name": "tree006",
"texturePath": "resources/w/exterior/tree001.png",
"meshPath": "resources/w/exterior/tree002.txt",
"rotationX": 0.0,
"rotationY": 0.0,
"rotationZ": 0.0,
"positionX": 8.49915,
"positionY": 0.0,
"positionZ": -2.59884,
"scale": 1.0,
"interactive": false
},
{
"name": "tree007",
"texturePath": "resources/w/exterior/tree001.png",
"meshPath": "resources/w/exterior/tree002.txt",
"rotationX": 0.0,
"rotationY": -1.5707963267948966,
"rotationZ": 0.0,
"positionX": 14.5936,
"positionY": 0.0,
"positionZ": 5.3401,
"scale": 1.0,
"interactive": false
},
{
"name": "tree008",
"texturePath": "resources/w/exterior/tree001.png",
"meshPath": "resources/w/exterior/tree002.txt",
"rotationX": 0.0,
"rotationY": 1.5707963267948966,
"rotationZ": 0.0,
"positionX": 23.9295,
"positionY": 0.0,
"positionZ": 9.00583,
"scale": 1.0,
"interactive": false
},
{
"name": "tree009",
"texturePath": "resources/w/exterior/tree001.png",
"meshPath": "resources/w/exterior/tree002.txt",
"rotationX": 0.0,
"rotationY": 0.0,
"rotationZ": 0.0,
"positionX": 29.8128,
"positionY": 0.0,
"positionZ": -1.45278,
"scale": 1.0,
"interactive": false
},
{
"name": "tree010",
"texturePath": "resources/w/exterior/tree001.png",
"meshPath": "resources/w/exterior/tree002.txt",
"rotationX": 0.0,
"rotationY": -1.5707963267948966,
"rotationZ": 0.0,
"positionX": 33.1771,
"positionY": 0.0,
"positionZ": 14.609,
"scale": 1.0,
"interactive": false
}
]
}

View File

@ -0,0 +1,18 @@
{
"cellSize": 0.4,
"agentRadius": 0.45,
"floorY": 0.0,
"objectPadding": 0.25,
"areas": [
{
"name": "main_corridor",
"available": true,
"polygon": [
[-200, 200],
[200, 200],
[200, -200],
[-200, -200]
]
}
]
}

View File

@ -1,103 +1,19 @@
{
"npcs": [
{
"id": "npc_01_default",
"name": "Студент",
"animationIdlePath": "resources/w/jam/man_stand_idle002.anim",
"animationWalkPath": "resources/w/jam/man_walk002.anim",
"meshTextures": {
"Body": "resources/w/jam/male_packed0_diffuse.png",
"Bottoms": "resources/w/jam/male_packed1_diffuse.png",
"Eyelashes": "resources/w/jam/male_packed0_diffuse.png",
"Eyes": "resources/w/jam/male_packed0_diffuse.png",
"Eyewear": "resources/w/jam/male_packed0_diffuse.png",
"Gloves": "resources/w/jam/male_packed1_diffuse.png",
"Hair": "resources/w/jam/male_packed0_diffuse.png",
"Shoes": "resources/w/jam/male_packed1_diffuse.png",
"Tops": "resources/w/jam/male_packed2_diffuse.png"
},
"positionX": 0.0,
"positionY": 0.0,
"positionZ": -10.0,
"walkSpeed": 1.5,
"rotationSpeed": 8.0,
"modelScale": 0.0001,
"modelCorrectionRotX": 0.0,
"modelCorrectionRotY": 180.0,
"modelCorrectionRotZ": 0.0,
"interactionRadius": 2.0,
"gift": {
"id": "guard_token",
"name": "Guard's Token",
"description": "A token from the Guard - sign of respect",
"icon": "resources/w/red.png"
}
},
{
"id": "npc_02_woman",
"name": "Студентка",
"animationIdlePath": "resources/w/jam/woman_idle002.anim",
"animationWalkPath": "resources/w/jam/woman_walk002.anim",
"meshTextures": {
"Body": "resources/w/jam/female_packed0_diffuse.png",
"Bottoms": "resources/w/jam/female_packed3_diffuse.png",
"Eyelashes": "resources/w/jam/female_packed0_diffuse.png",
"Eyes": "resources/w/jam/female_packed0_diffuse.png",
"Hair": "resources/w/jam/female_packed2_diffuse.png",
"Shoes": "resources/w/jam/female_packed1_diffuse.png",
"Tops": "resources/w/jam/female_packed2_diffuse.png"
},
"positionX": 2.0,
"positionY": 0.0,
"positionZ": -15.0,
"walkSpeed": 1.5,
"rotationSpeed": 8.0,
"modelScale": 0.0001,
"modelCorrectionRotX": 0.0,
"modelCorrectionRotY": 180.0,
"modelCorrectionRotZ": 0.0,
"interactionRadius": 2.0
},
{
"id": "npc_03_salesman",
"name": "Мухтар Байке",
"animationIdlePath": "resources/w/jam/salesperson_stand_idle003.anim",
"animationWalkPath": "resources/w/jam/salesperson_walk001.anim",
"meshTextures": {
"Body": "resources/w/jam/Salesperson_packed0_diffuse.png",
"Bottoms": "resources/w/jam/Salesperson_packed2_diffuse.png",
"Eyelashes": "resources/w/jam/Salesperson_packed0_diffuse.png",
"Eyes": "resources/w/jam/Salesperson_packed0_diffuse.png",
"Hats": "resources/w/jam/Salesperson_packed1_diffuse.png",
"Mustashes": "resources/w/jam/Salesperson_packed1_diffuse.png",
"Shoes": "resources/w/jam/Salesperson_packed1_diffuse.png",
"Tops": "resources/w/jam/Salesperson_packed1_diffuse.png"
},
"positionX": 1.0,
"positionY": 0.0,
"positionZ": -7.0,
"walkSpeed": 1.5,
"rotationSpeed": 8.0,
"modelScale": 0.001,
"modelCorrectionRotX": 0.0,
"modelCorrectionRotY": 180.0,
"modelCorrectionRotZ": 0.0,
"interactionRadius": 2.0
},
{
"id": "npc_04_ghost",
"name": "Добрый Призрак",
"name": "Беспокойный Призрак",
"texturePath": "resources/w/ghost_skin001.png",
"animationIdlePath": "resources/w/default_float001.anim",
"animationWalkPath": "resources/w/default_float001.anim",
"positionX": 0.0,
"positionY": 0.0,
"positionZ": -5.0,
"positionZ": -35.0,
"walkSpeed": 1.5,
"rotationSpeed": 8.0,
"modelScale": 0.01,
"modelCorrectionRotX": 0.0,
"modelCorrectionRotY": 0.0,
"modelCorrectionRotY": 180.0,
"modelCorrectionRotZ": 0.0,
"interactionRadius": 1.0,
"gift": {

View File

@ -0,0 +1,88 @@
{
"npcs": [
{
"id": "npc_01_default",
"name": "Студент",
"animationIdlePath": "resources/w/jam/man_stand_idle002.anim",
"animationWalkPath": "resources/w/jam/man_walk002.anim",
"meshTextures": {
"Body": "resources/w/jam/male_packed0_diffuse.png",
"Bottoms": "resources/w/jam/male_packed1_diffuse.png",
"Eyelashes": "resources/w/jam/male_packed0_diffuse.png",
"Eyes": "resources/w/jam/male_packed0_diffuse.png",
"Eyewear": "resources/w/jam/male_packed0_diffuse.png",
"Gloves": "resources/w/jam/male_packed1_diffuse.png",
"Hair": "resources/w/jam/male_packed0_diffuse.png",
"Shoes": "resources/w/jam/male_packed1_diffuse.png",
"Tops": "resources/w/jam/male_packed2_diffuse.png"
},
"positionX": 2.95,
"positionY": 0.0,
"positionZ": 16.65,
"walkSpeed": 1.5,
"rotationSpeed": 8.0,
"modelScale": 0.0001,
"modelCorrectionRotX": 0.0,
"modelCorrectionRotY": 180.0,
"modelCorrectionRotZ": 0.0,
"interactionRadius": 2.0,
"gift": {
"id": "guard_token",
"name": "Guard's Token",
"description": "A token from the Guard - sign of respect",
"icon": "resources/w/red.png"
}
},
{
"id": "npc_02_woman",
"name": "Студентка",
"animationIdlePath": "resources/w/jam/woman_idle002.anim",
"animationWalkPath": "resources/w/jam/woman_walk002.anim",
"meshTextures": {
"Body": "resources/w/jam/female_packed0_diffuse.png",
"Bottoms": "resources/w/jam/female_packed3_diffuse.png",
"Eyelashes": "resources/w/jam/female_packed0_diffuse.png",
"Eyes": "resources/w/jam/female_packed0_diffuse.png",
"Hair": "resources/w/jam/female_packed2_diffuse.png",
"Shoes": "resources/w/jam/female_packed1_diffuse.png",
"Tops": "resources/w/jam/female_packed2_diffuse.png"
},
"positionX": 19.5,
"positionY": 0.0,
"positionZ": 32.0,
"walkSpeed": 1.5,
"rotationSpeed": 8.0,
"modelScale": 0.0001,
"modelCorrectionRotX": 0.0,
"modelCorrectionRotY": 180.0,
"modelCorrectionRotZ": 0.0,
"interactionRadius": 2.0
},
{
"id": "npc_03_salesman",
"name": "Мухтар Байке",
"animationIdlePath": "resources/w/jam/salesperson_stand_idle003.anim",
"animationWalkPath": "resources/w/jam/salesperson_walk001.anim",
"meshTextures": {
"Body": "resources/w/jam/Salesperson_packed0_diffuse.png",
"Bottoms": "resources/w/jam/Salesperson_packed2_diffuse.png",
"Eyelashes": "resources/w/jam/Salesperson_packed0_diffuse.png",
"Eyes": "resources/w/jam/Salesperson_packed0_diffuse.png",
"Hats": "resources/w/jam/Salesperson_packed1_diffuse.png",
"Mustashes": "resources/w/jam/Salesperson_packed1_diffuse.png",
"Shoes": "resources/w/jam/Salesperson_packed1_diffuse.png",
"Tops": "resources/w/jam/Salesperson_packed1_diffuse.png"
},
"positionX": -1.94774,
"positionY": 0.0,
"positionZ": 16.2712,
"walkSpeed": 1.5,
"rotationSpeed": 8.0,
"modelScale": 0.001,
"modelCorrectionRotX": 0.0,
"modelCorrectionRotY": 180.0,
"modelCorrectionRotZ": 0.0,
"interactionRadius": 2.0
}
]
}

View File

@ -1,6 +1,116 @@
{
"dialogues": [
{
"id": "dialog_student",
"start": "line_1",
"nodes": [
{
"id": "line_1",
"type": "Line",
"speaker": "Студент",
"portrait": "resources/w/avatar_unknown.png",
"text": "В университете завелись призраки, мне страшно ходить на занятия.",
"next": "line_2"
},
{
"id": "line_2",
"type": "Line",
"speaker": "Hero",
"portrait": "resources/w/gg/gg2_s_podsvetkoy5.png",
"text": "Можешь рассказать подробнее?",
"next": "line_3"
},
{
"id": "line_3",
"type": "Line",
"speaker": "Студент",
"portrait": "resources/w/avatar_unknown.png",
"text": "Спроси у Мухтара байке, он все знает.",
"next": "line_4"
},
{
"id": "line_4",
"type": "Line",
"speaker": "Hero",
"portrait": "resources/w/gg/gg2_s_podsvetkoy5.png",
"text": "Хорошо.",
"next": "end_1"
},
{
"id": "end_1",
"type": "End"
}
]
},
{
"id": "dialog_mukhtar",
"start": "line_1",
"nodes": [
{
"id": "line_1",
"type": "Line",
"speaker": "Мухтар байке",
"portrait": "resources/w/avatar_unknown.png",
"text": "Здравствуй, мы давно тебя ждем! Ты поможешь нам избавиться от призраков?",
"next": "line_2"
},
{
"id": "line_2",
"type": "Line",
"speaker": "Hero",
"portrait": "resources/w/gg/gg2_s_podsvetkoy5.png",
"text": "Где их найти?",
"next": "line_3"
},
{
"id": "line_3",
"type": "Line",
"speaker": "Мухтар байке",
"portrait": "resources/w/avatar_unknown.png",
"text": "Заходи в здание универа и поднимайся на второй этаж.",
"next": "line_4"
},
{
"id": "line_4",
"type": "Line",
"speaker": "Мухтар байке",
"portrait": "resources/w/avatar_unknown.png",
"text": "Ты их встретишь прямо там.",
"next": "line_5"
},
{
"id": "line_4",
"type": "Line",
"speaker": "Hero",
"portrait": "resources/w/gg/gg2_s_podsvetkoy5.png",
"text": "Хорошо, я скоро вернусь!",
"next": "end_1"
},
{
"id": "end_1",
"type": "End"
}
]
},
{
"id": "dialog_female_student",
"start": "line_1",
"nodes": [
{
"id": "line_1",
"type": "Line",
"speaker": "Студентка",
"portrait": "resources/w/avatar_unknown.png",
"text": "С этими призраками совсем невозможно ходить на лекции!",
"next": "end_1"
},
{
"id": "end_1",
"type": "End"
}
]
},
{
"id": "test_line_dialogue",
"start": "line_1",
"nodes": [
@ -43,15 +153,15 @@
]
},
{
"id": "test_choice_dialogue",
"id": "ghost_choice_dialogue",
"start": "line_1",
"nodes": [
{
"id": "line_1",
"type": "Line",
"speaker": "Merchant",
"speaker": "Беспокойный Призрак",
"portrait": "resources/ghost_avatar.png",
"text": "What do you want?",
"text": "Нечасто я вижу смертных, готовых разговаривать со мной.",
"next": "choice_1"
},
{
@ -64,13 +174,13 @@
{
"id": "main_1",
"kind": "Main",
"text": "Show me your goods.",
"text": "Не мешай студентам учиться!",
"next": "line_goods"
},
{
"id": "optional_1",
"kind": "Optional",
"text": "Who are you?",
"text": "Почему ты появился здесь?",
"next": "line_who"
}
]
@ -78,17 +188,17 @@
{
"id": "line_goods",
"type": "Line",
"speaker": "Merchant",
"speaker": "Беспокойный Призрак",
"portrait": "resources/ghost_avatar.png",
"text": "Take a look.",
"text": "Это моя месть студентам за то что они призвали меня.",
"next": "end_1"
},
{
"id": "line_who",
"type": "Line",
"speaker": "Merchant",
"speaker": "Беспокойный Призрак",
"portrait": "resources/ghost_avatar.png",
"text": "Just a trader passing through.",
"text": "Группа студентов совершила ритуал и призвала меня сюда. Пока проклятие не спадет, я всегда буду здесь обитать.",
"next": "choice_1"
},
{

View File

@ -0,0 +1,16 @@
attribute vec3 vPosition;
attribute vec2 vTexCoord;
varying vec2 texCoord;
varying float fogDistance;
uniform mat4 ProjectionModelViewMatrix;
uniform mat4 ModelViewMatrix;
uniform vec3 uPlayerEyePos;
void main()
{
vec4 eyePos = ModelViewMatrix * vec4(vPosition.xyz, 1.0);
fogDistance = length(eyePos.xyz - uPlayerEyePos);
gl_Position = ProjectionModelViewMatrix * vec4(vPosition.xyz, 1.0);
texCoord = vTexCoord;
}

View File

@ -0,0 +1,18 @@
//precisionmediump float;
uniform sampler2D Texture;
varying vec2 texCoord;
varying float fogDistance;
void main()
{
vec4 color = texture2D(Texture,texCoord).rgba;
if(color.a < 0.1)
discard;
vec3 fogColor = vec3(0.53, 0.81, 0.92);
float fogFactor = clamp((fogDistance - 30.0) / 10.0, 0.0, 1.0);
vec3 finalColor = mix(color.rgb, fogColor, fogFactor);
gl_FragColor = vec4(finalColor, color.a);
}

View File

@ -0,0 +1,23 @@
attribute vec3 vPosition;
attribute vec2 vTexCoord;
attribute vec3 vNormal;
varying vec2 texCoord;
varying vec4 fragPosLightSpace;
varying vec3 fragNormal;
varying float fogDistance;
uniform mat4 ProjectionModelViewMatrix;
uniform mat4 ModelViewMatrix;
uniform mat4 uLightFromCamera;
uniform vec3 uPlayerEyePos;
void main()
{
vec4 eyePos = ModelViewMatrix * vec4(vPosition, 1.0);
fogDistance = length(eyePos.xyz - uPlayerEyePos);
gl_Position = ProjectionModelViewMatrix * vec4(vPosition, 1.0);
texCoord = vTexCoord;
fragPosLightSpace = uLightFromCamera * eyePos;
fragNormal = mat3(ModelViewMatrix) * vNormal;
}

View File

@ -0,0 +1,78 @@
uniform sampler2D Texture;
uniform sampler2D uShadowMap;
uniform vec3 uLightDir;
varying vec2 texCoord;
varying vec4 fragPosLightSpace;
varying vec3 fragNormal;
varying float fogDistance;
float computeShadow(vec4 lightSpacePos, vec3 normal)
{
vec3 projCoords = lightSpacePos.xyz / lightSpacePos.w;
projCoords = projCoords * 0.5 + 0.5;
if (projCoords.x < 0.0 || projCoords.x > 1.0 ||
projCoords.y < 0.0 || projCoords.y > 1.0 ||
projCoords.z > 1.0)
{
return 0.0;
}
float currentDepth = projCoords.z;
// Slope-dependent bias: large for grazing angles, tiny for surfaces facing the light
float bias = 0.0004;
if (dot(normal, normal) > 0.001)
{
float cosTheta = dot(normalize(normal), -normalize(uLightDir));
bias = max(0.002 * (1.0 - cosTheta), 0.0002);
}
// 3x3 PCF (percentage-closer filtering) for softer shadows
float shadow = 0.0;
float texelSize = 1.0 / 2048.0;
for (int x = -1; x <= 1; x++)
{
for (int y = -1; y <= 1; y++)
{
float pcfDepth = texture2D(uShadowMap, projCoords.xy + vec2(float(x), float(y)) * texelSize).r;
shadow += currentDepth - bias > pcfDepth ? 1.0 : 0.0;
}
}
shadow /= 9.0;
return shadow;
}
void main()
{
vec4 color = texture2D(Texture, texCoord);
if (color.a < 0.1)
discard;
float ambient = 0.4;
float diffuseStrength = 0.6;
// Compute diffuse term; if normals are missing (zero-length) treat as fully lit
float diffuse = 1.0;
vec3 n = fragNormal;
if (dot(n, n) > 0.001)
{
n = normalize(n);
diffuse = max(dot(n, -normalize(uLightDir)), 0.0);
}
float shadow = computeShadow(fragPosLightSpace, fragNormal);
// Shadow dims only the diffuse contribution; ambient is always present
float lighting = ambient + diffuseStrength * diffuse * (1.0 - shadow);
color.rgb *= lighting;
vec3 fogColor = vec3(0.53, 0.81, 0.92);
float fogFactor = clamp((fogDistance - 30.0) / 10.0, 0.0, 1.0);
color.rgb = mix(color.rgb, fogColor, fogFactor);
gl_FragColor = color;
}

View File

@ -0,0 +1,76 @@
precision mediump float;
uniform sampler2D Texture;
uniform sampler2D uShadowMap;
uniform vec3 uLightDir;
varying vec2 texCoord;
varying vec4 fragPosLightSpace;
varying vec3 fragNormal;
varying float fogDistance;
float computeShadow(vec4 lightSpacePos, vec3 normal)
{
vec3 projCoords = lightSpacePos.xyz / lightSpacePos.w;
projCoords = projCoords * 0.5 + 0.5;
if (projCoords.x < 0.0 || projCoords.x > 1.0 ||
projCoords.y < 0.0 || projCoords.y > 1.0 ||
projCoords.z > 1.0)
{
return 0.0;
}
float currentDepth = projCoords.z;
float bias = 0.0004;
if (dot(normal, normal) > 0.001)
{
float cosTheta = dot(normalize(normal), -normalize(uLightDir));
bias = max(0.002 * (1.0 - cosTheta), 0.0002);
}
float shadow = 0.0;
float texelSize = 1.0 / 2048.0;
for (int x = -1; x <= 1; x++)
{
for (int y = -1; y <= 1; y++)
{
float pcfDepth = texture2D(uShadowMap, projCoords.xy + vec2(float(x), float(y)) * texelSize).r;
shadow += currentDepth - bias > pcfDepth ? 1.0 : 0.0;
}
}
shadow /= 9.0;
return shadow;
}
void main()
{
vec4 color = texture2D(Texture, texCoord);
if (color.a < 0.1)
discard;
float ambient = 0.4;
float diffuseStrength = 0.6;
float diffuse = 1.0;
vec3 n = fragNormal;
if (dot(n, n) > 0.001)
{
n = normalize(n);
diffuse = max(dot(n, -normalize(uLightDir)), 0.0);
}
float shadow = computeShadow(fragPosLightSpace, fragNormal);
float lighting = ambient + diffuseStrength * diffuse * (1.0 - shadow);
color.rgb *= lighting;
vec3 fogColor = vec3(0.53, 0.81, 0.92);
float fogFactor = clamp((fogDistance - 30.0) / 10.0, 0.0, 1.0);
color.rgb = mix(color.rgb, fogColor, fogFactor);
gl_FragColor = color;
}

View File

@ -0,0 +1,55 @@
attribute vec3 vPosition;
attribute vec2 vTexCoord;
attribute vec4 aBoneIndices0;
attribute vec2 aBoneIndices1;
attribute vec4 aBoneWeights0;
attribute vec2 aBoneWeights1;
varying vec2 texCoord;
varying float fogDistance;
uniform mat4 ProjectionModelViewMatrix;
uniform mat4 ModelViewMatrix;
uniform mat4 uBoneMatrices[64];
uniform vec3 uPlayerEyePos;
void main()
{
vec4 skinnedPos = vec4(0.0, 0.0, 0.0, 0.0);
vec4 originalPos = vec4(vPosition, 1.0);
float totalWeight = 0.0;
if (aBoneWeights0.x > 0.0) {
skinnedPos += uBoneMatrices[int(aBoneIndices0.x)] * originalPos * aBoneWeights0.x;
totalWeight += aBoneWeights0.x;
}
if (aBoneWeights0.y > 0.0) {
skinnedPos += uBoneMatrices[int(aBoneIndices0.y)] * originalPos * aBoneWeights0.y;
totalWeight += aBoneWeights0.y;
}
if (aBoneWeights0.z > 0.0) {
skinnedPos += uBoneMatrices[int(aBoneIndices0.z)] * originalPos * aBoneWeights0.z;
totalWeight += aBoneWeights0.z;
}
if (aBoneWeights0.w > 0.0) {
skinnedPos += uBoneMatrices[int(aBoneIndices0.w)] * originalPos * aBoneWeights0.w;
totalWeight += aBoneWeights0.w;
}
if (aBoneWeights1.x > 0.0) {
skinnedPos += uBoneMatrices[int(aBoneIndices1.x)] * originalPos * aBoneWeights1.x;
totalWeight += aBoneWeights1.x;
}
if (aBoneWeights1.y > 0.0) {
skinnedPos += uBoneMatrices[int(aBoneIndices1.y)] * originalPos * aBoneWeights1.y;
totalWeight += aBoneWeights1.y;
}
if (totalWeight < 0.001) {
skinnedPos = originalPos;
}
vec4 eyePos = ModelViewMatrix * skinnedPos;
fogDistance = length(eyePos.xyz - uPlayerEyePos);
gl_Position = ProjectionModelViewMatrix * skinnedPos;
texCoord = vTexCoord;
}

View File

@ -0,0 +1,69 @@
attribute vec3 vPosition;
attribute vec2 vTexCoord;
attribute vec3 vNormal;
attribute vec4 aBoneIndices0;
attribute vec2 aBoneIndices1;
attribute vec4 aBoneWeights0;
attribute vec2 aBoneWeights1;
varying vec2 texCoord;
varying vec4 fragPosLightSpace;
varying vec3 fragNormal;
varying float fogDistance;
uniform mat4 ProjectionModelViewMatrix;
uniform mat4 ModelViewMatrix;
uniform mat4 uLightFromCamera;
uniform mat4 uBoneMatrices[64];
uniform vec3 uPlayerEyePos;
void main()
{
vec4 skinnedPos = vec4(0.0, 0.0, 0.0, 0.0);
vec3 skinnedNormal = vec3(0.0, 0.0, 0.0);
vec4 originalPos = vec4(vPosition, 1.0);
float totalWeight = 0.0;
if (aBoneWeights0.x > 0.0) {
skinnedPos += uBoneMatrices[int(aBoneIndices0.x)] * originalPos * aBoneWeights0.x;
skinnedNormal += mat3(uBoneMatrices[int(aBoneIndices0.x)]) * vNormal * aBoneWeights0.x;
totalWeight += aBoneWeights0.x;
}
if (aBoneWeights0.y > 0.0) {
skinnedPos += uBoneMatrices[int(aBoneIndices0.y)] * originalPos * aBoneWeights0.y;
skinnedNormal += mat3(uBoneMatrices[int(aBoneIndices0.y)]) * vNormal * aBoneWeights0.y;
totalWeight += aBoneWeights0.y;
}
if (aBoneWeights0.z > 0.0) {
skinnedPos += uBoneMatrices[int(aBoneIndices0.z)] * originalPos * aBoneWeights0.z;
skinnedNormal += mat3(uBoneMatrices[int(aBoneIndices0.z)]) * vNormal * aBoneWeights0.z;
totalWeight += aBoneWeights0.z;
}
if (aBoneWeights0.w > 0.0) {
skinnedPos += uBoneMatrices[int(aBoneIndices0.w)] * originalPos * aBoneWeights0.w;
skinnedNormal += mat3(uBoneMatrices[int(aBoneIndices0.w)]) * vNormal * aBoneWeights0.w;
totalWeight += aBoneWeights0.w;
}
if (aBoneWeights1.x > 0.0) {
skinnedPos += uBoneMatrices[int(aBoneIndices1.x)] * originalPos * aBoneWeights1.x;
skinnedNormal += mat3(uBoneMatrices[int(aBoneIndices1.x)]) * vNormal * aBoneWeights1.x;
totalWeight += aBoneWeights1.x;
}
if (aBoneWeights1.y > 0.0) {
skinnedPos += uBoneMatrices[int(aBoneIndices1.y)] * originalPos * aBoneWeights1.y;
skinnedNormal += mat3(uBoneMatrices[int(aBoneIndices1.y)]) * vNormal * aBoneWeights1.y;
totalWeight += aBoneWeights1.y;
}
if (totalWeight < 0.001) {
skinnedPos = originalPos;
skinnedNormal = vNormal;
}
vec4 eyePos = ModelViewMatrix * skinnedPos;
fogDistance = length(eyePos.xyz - uPlayerEyePos);
gl_Position = ProjectionModelViewMatrix * skinnedPos;
texCoord = vTexCoord;
fragPosLightSpace = uLightFromCamera * eyePos;
fragNormal = mat3(ModelViewMatrix) * skinnedNormal;
}

View File

@ -0,0 +1,18 @@
precision mediump float;
uniform sampler2D Texture;
varying vec2 texCoord;
varying float fogDistance;
void main()
{
vec4 color = texture2D(Texture,texCoord).rgba;
if(color.a < 0.1)
discard;
vec3 fogColor = vec3(0.53, 0.81, 0.92);
float fogFactor = clamp((fogDistance - 30.0) / 10.0, 0.0, 1.0);
vec3 finalColor = mix(color.rgb, fogColor, fogFactor);
gl_FragColor = vec4(finalColor, color.a);
}

View File

@ -15,7 +15,7 @@ function step1()
game_api.npc_walk_to(0, 2.0, 0.0, -2.0, step2)
end
step1()
--step1()
local function step3x()
game_api.npc_walk_to(2, 2.0, 0.0, -27.0, step1x)
@ -29,7 +29,7 @@ function step1x()
game_api.npc_walk_to(2, 2.0, 0.0, -16.0, step2x)
end
step1x()
--step1x()
-- ============================================
-- ITEM PICKUP HANDLER
-- ============================================
@ -46,11 +46,7 @@ end
function on_npc_interact(npc_index)
print("[Lua] NPC interaction! Index: " .. tostring(npc_index))
if npc_index == 1 then
game_api.start_dialogue("test_line_dialogue")
else
game_api.receive_npc_gift(npc_index)
end
game_api.start_dialogue("ghost_choice_dialogue")
end
print("Lua script loaded successfully!")

56
resources/start2.lua Normal file
View File

@ -0,0 +1,56 @@
-- ============================================
-- NPC PATROL WAYPOINTS
-- ============================================
local function step2()
game_api.npc_walk_to(1, 19.5, 0.0, 32, step1)
end
function step1()
game_api.npc_walk_to(1, -6.45, 0.0, 7.82, step2)
end
step1()
local function step3x()
game_api.npc_walk_to(2, 2.0, 0.0, -27.0, step1x)
end
local function step2x()
game_api.npc_walk_to(2, -1.0, 0.0, -12.0, step3x)
end
function step1x()
game_api.npc_walk_to(2, 2.0, 0.0, -16.0, step2x)
end
--step1x()
-- ============================================
-- ITEM PICKUP HANDLER
-- ============================================
function on_health_pickup()
game_api.pickup_item("health_potion")
print("[Lua] Health potion picked up!")
end
-- ============================================
-- NPC INTERACTION HANDLER
-- ============================================
function on_npc_interact(npc_index)
print("[Lua] NPC interaction! Index: " .. tostring(npc_index))
if npc_index == 0 then
game_api.start_dialogue("dialog_student")
end
if npc_index == 1 then
game_api.start_dialogue("dialog_female_student")
end
if npc_index == 2 then
game_api.start_dialogue("dialog_mukhtar")
end
end
print("Lua script loaded successfully!")

BIN
resources/w/avatar_unknown.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
resources/w/exterior/Main_Building.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,37 @@
===Vertices (Split by UV/Normal): 22
V 0: Pos(-15.0, -3.75, 0.0) Norm(-0.57735, -0.57735, -0.57735) UV(1.0, 0.208333)
V 1: Pos(-15.0, -3.75, 7.0) Norm(-0.57735, -0.57735, 0.57735) UV(0.805556, 0.208333)
V 2: Pos(-15.0, 3.75, 7.0) Norm(-0.57735, 0.57735, 0.57735) UV(0.805556, 0.0)
V 3: Pos(-15.0, 3.75, 0.0) Norm(-0.57735, 0.57735, -0.57735) UV(1.0, 0.0)
V 4: Pos(-15.0, 3.75, 0.0) Norm(-0.57735, 0.57735, -0.57735) UV(0.611111, 0.833333)
V 5: Pos(-15.0, 3.75, 7.0) Norm(-0.57735, 0.57735, 0.57735) UV(0.416667, 0.833333)
V 6: Pos(15.0, 3.75, 7.0) Norm(0.57735, 0.57735, 0.57735) UV(0.416667, -0.0)
V 7: Pos(15.0, 3.75, 0.0) Norm(0.57735, 0.57735, -0.57735) UV(0.611111, -0.0)
V 8: Pos(15.0, 3.75, 0.0) Norm(0.57735, 0.57735, -0.57735) UV(1.0, 0.416667)
V 9: Pos(15.0, 3.75, 7.0) Norm(0.57735, 0.57735, 0.57735) UV(0.805556, 0.416667)
V 10: Pos(15.0, -3.75, 7.0) Norm(0.57735, -0.57735, 0.57735) UV(0.805556, 0.208333)
V 11: Pos(15.0, -3.75, 0.0) Norm(0.57735, -0.57735, -0.57735) UV(1.0, 0.208333)
V 12: Pos(15.0, -3.75, 0.0) Norm(0.57735, -0.57735, -0.57735) UV(0.805556, 0.833333)
V 13: Pos(15.0, -3.75, 7.0) Norm(0.57735, -0.57735, 0.57735) UV(0.611111, 0.833333)
V 14: Pos(-15.0, -3.75, 7.0) Norm(-0.57735, -0.57735, 0.57735) UV(0.611111, -0.0)
V 15: Pos(-15.0, -3.75, 0.0) Norm(-0.57735, -0.57735, -0.57735) UV(0.805556, 0.0)
V 16: Pos(-15.0, 3.75, 0.0) Norm(-0.57735, 0.57735, -0.57735) UV(0.208333, 0.0)
V 17: Pos(15.0, 3.75, 0.0) Norm(0.57735, 0.57735, -0.57735) UV(0.208333, 0.833333)
V 18: Pos(15.0, -3.75, 0.0) Norm(0.57735, -0.57735, -0.57735) UV(0.0, 0.833333)
V 19: Pos(-15.0, -3.75, 0.0) Norm(-0.57735, -0.57735, -0.57735) UV(0.0, 0.0)
V 20: Pos(-15.0, -3.75, 7.0) Norm(-0.57735, -0.57735, 0.57735) UV(0.208333, 0.833333)
V 21: Pos(15.0, -3.75, 7.0) Norm(0.57735, -0.57735, 0.57735) UV(0.208333, -0.0)
===Triangles (Indices): 12
Tri: 0 1 2
Tri: 0 2 3
Tri: 4 5 6
Tri: 4 6 7
Tri: 8 9 10
Tri: 8 10 11
Tri: 12 13 14
Tri: 12 14 15
Tri: 16 17 18
Tri: 16 18 19
Tri: 6 5 20
Tri: 6 20 21

BIN
resources/w/exterior/Segmented_Plane — копия.png (Stored with Git LFS) Normal file

Binary file not shown.

BIN
resources/w/exterior/Segmented_Plane.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,37 @@
===Vertices (Split by UV/Normal): 16
V 0: Pos(-33.333332, -100.0, 0.0) Norm(0.0, 0.0, 1.0) UV(0.333333, 0.0)
V 1: Pos(-100.0, -33.333332, 0.0) Norm(0.0, 0.0, 1.0) UV(0.0, 0.333333)
V 2: Pos(-100.0, -100.0, 0.0) Norm(0.0, 0.0, 1.0) UV(0.0, 0.0)
V 3: Pos(33.333336, -100.0, 0.0) Norm(0.0, 0.0, 1.0) UV(0.666667, 0.0)
V 4: Pos(-33.333332, -33.333332, 0.0) Norm(0.0, 0.0, 1.0) UV(0.333333, 0.333333)
V 5: Pos(100.0, -100.0, 0.0) Norm(0.0, 0.0, 1.0) UV(1.0, 0.0)
V 6: Pos(33.333336, -33.333332, 0.0) Norm(0.0, 0.0, 1.0) UV(0.666667, 0.333333)
V 7: Pos(-100.0, 33.333336, 0.0) Norm(0.0, 0.0, 1.0) UV(0.0, 0.666667)
V 8: Pos(-33.333332, 33.333336, 0.0) Norm(0.0, 0.0, 1.0) UV(0.333333, 0.666667)
V 9: Pos(100.0, -33.333332, 0.0) Norm(0.0, 0.0, 1.0) UV(1.0, 0.333333)
V 10: Pos(33.333336, 33.333336, 0.0) Norm(0.0, 0.0, 1.0) UV(0.666667, 0.666667)
V 11: Pos(-100.0, 100.0, 0.0) Norm(0.0, 0.0, 1.0) UV(0.0, 1.0)
V 12: Pos(-33.333332, 100.0, 0.0) Norm(0.0, 0.0, 1.0) UV(0.333333, 1.0)
V 13: Pos(100.0, 33.333336, 0.0) Norm(0.0, 0.0, 1.0) UV(1.0, 0.666667)
V 14: Pos(33.333336, 100.0, 0.0) Norm(0.0, 0.0, 1.0) UV(0.666667, 1.0)
V 15: Pos(100.0, 100.0, 0.0) Norm(0.0, 0.0, 1.0) UV(1.0, 1.0)
===Triangles (Indices): 18
Tri: 0 1 2
Tri: 3 4 0
Tri: 5 6 3
Tri: 4 7 1
Tri: 6 8 4
Tri: 9 10 6
Tri: 8 11 7
Tri: 10 12 8
Tri: 13 14 10
Tri: 0 4 1
Tri: 3 6 4
Tri: 5 9 6
Tri: 4 8 7
Tri: 6 10 8
Tri: 9 13 10
Tri: 8 12 11
Tri: 10 14 12
Tri: 13 15 14

BIN
resources/w/exterior/Segmented_Plane002.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,60 @@
===Vertices (Split by UV/Normal): 25
V 0: Pos(-75.0, -75.0, 0.0) Norm(0.0, 0.0, 1.0) UV(0.0, 0.0)
V 1: Pos(-37.5, -75.0, 0.0) Norm(0.0, 0.0, 1.0) UV(0.25, 0.0)
V 2: Pos(-37.5, -37.5, 0.0) Norm(0.0, 0.0, 1.0) UV(0.25, 0.25)
V 3: Pos(-75.0, -37.5, 0.0) Norm(0.0, 0.0, 1.0) UV(0.0, 0.25)
V 4: Pos(0.0, -75.0, 0.0) Norm(0.0, 0.0, 1.0) UV(0.5, 0.0)
V 5: Pos(0.0, -37.5, 0.0) Norm(0.0, 0.0, 1.0) UV(0.5, 0.25)
V 6: Pos(37.5, -75.0, 0.0) Norm(0.0, 0.0, 1.0) UV(0.75, 0.0)
V 7: Pos(37.5, -37.5, 0.0) Norm(0.0, 0.0, 1.0) UV(0.75, 0.25)
V 8: Pos(75.0, -75.0, 0.0) Norm(0.0, 0.0, 1.0) UV(1.0, 0.0)
V 9: Pos(75.0, -37.5, 0.0) Norm(0.0, 0.0, 1.0) UV(1.0, 0.25)
V 10: Pos(-37.5, 0.0, 0.0) Norm(0.0, 0.0, 1.0) UV(0.25, 0.5)
V 11: Pos(-75.0, 0.0, 0.0) Norm(0.0, 0.0, 1.0) UV(0.0, 0.5)
V 12: Pos(0.0, 0.0, 0.0) Norm(0.0, 0.0, 1.0) UV(0.5, 0.5)
V 13: Pos(37.5, 0.0, 0.0) Norm(0.0, 0.0, 1.0) UV(0.75, 0.5)
V 14: Pos(75.0, 0.0, 0.0) Norm(0.0, 0.0, 1.0) UV(1.0, 0.5)
V 15: Pos(-37.5, 37.5, 0.0) Norm(0.0, 0.0, 1.0) UV(0.25, 0.75)
V 16: Pos(-75.0, 37.5, 0.0) Norm(0.0, 0.0, 1.0) UV(0.0, 0.75)
V 17: Pos(0.0, 37.5, 0.0) Norm(0.0, 0.0, 1.0) UV(0.5, 0.75)
V 18: Pos(37.5, 37.5, 0.0) Norm(0.0, 0.0, 1.0) UV(0.75, 0.75)
V 19: Pos(75.0, 37.5, 0.0) Norm(0.0, 0.0, 1.0) UV(1.0, 0.75)
V 20: Pos(-37.5, 75.0, 0.0) Norm(0.0, 0.0, 1.0) UV(0.25, 1.0)
V 21: Pos(-75.0, 75.0, 0.0) Norm(0.0, 0.0, 1.0) UV(0.0, 1.0)
V 22: Pos(0.0, 75.0, 0.0) Norm(0.0, 0.0, 1.0) UV(0.5, 1.0)
V 23: Pos(37.5, 75.0, 0.0) Norm(0.0, 0.0, 1.0) UV(0.75, 1.0)
V 24: Pos(75.0, 75.0, 0.0) Norm(0.0, 0.0, 1.0) UV(1.0, 1.0)
===Triangles (Indices): 32
Tri: 0 1 2
Tri: 0 2 3
Tri: 1 4 5
Tri: 1 5 2
Tri: 4 6 7
Tri: 4 7 5
Tri: 6 8 9
Tri: 6 9 7
Tri: 3 2 10
Tri: 3 10 11
Tri: 2 5 12
Tri: 2 12 10
Tri: 5 7 13
Tri: 5 13 12
Tri: 7 9 14
Tri: 7 14 13
Tri: 11 10 15
Tri: 11 15 16
Tri: 10 12 17
Tri: 10 17 15
Tri: 12 13 18
Tri: 12 18 17
Tri: 13 14 19
Tri: 13 19 18
Tri: 16 15 20
Tri: 16 20 21
Tri: 15 17 22
Tri: 15 22 20
Tri: 17 18 23
Tri: 17 23 22
Tri: 18 19 24
Tri: 18 24 23

BIN
resources/w/exterior/door002.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -0,0 +1,649 @@
===Vertices (Split by UV/Normal): 352
V 0: Pos(7.130006, -4.5, 0.0) Norm(-0.57735, -0.57735, -0.57735) UV(0.4629, 0.662837)
V 1: Pos(7.130006, -4.5, 0.2) Norm(-0.57735, -0.57735, 0.57735) UV(0.422084, 0.662837)
V 2: Pos(7.130006, -3.75, 0.2) Norm(-0.57735, 0.57735, 0.57735) UV(0.422084, 0.510204)
V 3: Pos(7.130006, -3.75, 0.0) Norm(-0.57735, 0.57735, -0.57735) UV(0.4629, 0.510204)
V 4: Pos(7.130006, -3.75, 0.0) Norm(-0.57735, 0.57735, -0.57735) UV(0.897273, 0.397884)
V 5: Pos(7.130006, -3.75, 0.2) Norm(-0.57735, 0.57735, 0.57735) UV(0.856457, 0.397884)
V 6: Pos(9.130006, -3.75, 0.2) Norm(0.57735, 0.57735, 0.57735) UV(0.856457, -0.0)
V 7: Pos(9.130006, -3.75, 0.0) Norm(0.57735, 0.57735, -0.57735) UV(0.897273, -0.0)
V 8: Pos(9.130006, -3.75, 0.0) Norm(0.57735, 0.57735, -0.57735) UV(0.503716, 0.65941)
V 9: Pos(9.130006, -3.75, 0.2) Norm(0.57735, 0.57735, 0.57735) UV(0.4629, 0.65941)
V 10: Pos(9.130006, -4.5, 0.2) Norm(0.57735, -0.57735, 0.57735) UV(0.4629, 0.510204)
V 11: Pos(9.130006, -4.5, 0.0) Norm(0.57735, -0.57735, -0.57735) UV(0.503716, 0.510204)
V 12: Pos(9.130006, -4.5, 0.0) Norm(0.57735, -0.57735, -0.57735) UV(0.891791, 0.835592)
V 13: Pos(9.130006, -4.5, 0.2) Norm(0.57735, -0.57735, 0.57735) UV(0.850975, 0.835592)
V 14: Pos(7.130006, -4.5, 0.2) Norm(-0.57735, -0.57735, 0.57735) UV(0.850975, 0.428571)
V 15: Pos(7.130006, -4.5, 0.0) Norm(-0.57735, -0.57735, -0.57735) UV(0.891792, 0.428571)
V 16: Pos(7.130006, -3.75, 0.0) Norm(-0.57735, 0.57735, -0.57735) UV(0.153061, 0.510204)
V 17: Pos(9.130006, -3.75, 0.0) Norm(0.57735, 0.57735, -0.57735) UV(0.153061, 0.918367)
V 18: Pos(9.130006, -4.5, 0.0) Norm(0.57735, -0.57735, -0.57735) UV(0.0, 0.918367)
V 19: Pos(7.130006, -4.5, 0.0) Norm(-0.57735, -0.57735, -0.57735) UV(0.0, 0.510204)
V 20: Pos(9.130006, -3.75, 0.2) Norm(0.57735, 0.57735, 0.57735) UV(0.306122, 0.510204)
V 21: Pos(7.130006, -3.75, 0.2) Norm(-0.57735, 0.57735, 0.57735) UV(0.306122, 0.918367)
V 22: Pos(7.130006, -4.5, 0.2) Norm(-0.57735, -0.57735, 0.57735) UV(0.153061, 0.918367)
V 23: Pos(9.130006, -4.5, 0.2) Norm(0.57735, -0.57735, 0.57735) UV(0.153061, 0.510204)
V 24: Pos(7.430006, -3.875, 0.0) Norm(-0.707107, -0.707107, 0.0) UV(0.0, 0.0)
V 25: Pos(7.430006, -3.875, 2.2) Norm(-0.57735, -0.57735, 0.57735) UV(0.0, 0.0)
V 26: Pos(7.430006, -3.625, 2.2) Norm(-0.57735, 0.57735, 0.57735) UV(0.0, 0.0)
V 27: Pos(7.430006, -3.625, 0.0) Norm(-0.707107, 0.707107, 0.0) UV(0.0, 0.0)
V 28: Pos(8.830006, -3.625, 2.2) Norm(0.57735, 0.57735, 0.57735) UV(0.0, 0.0)
V 29: Pos(8.830006, -3.625, 0.0) Norm(0.707107, 0.707107, 0.0) UV(0.0, 0.0)
V 30: Pos(8.830006, -3.875, 2.2) Norm(0.57735, -0.57735, 0.57735) UV(0.0, 0.0)
V 31: Pos(8.830006, -3.875, 0.0) Norm(0.707107, -0.707107, 0.0) UV(0.0, 0.0)
V 32: Pos(7.530005, -3.9, 0.0) Norm(-0.57735, -0.57735, -0.57735) UV(0.897274, 0.937347)
V 33: Pos(7.530005, -3.9, 2.1) Norm(-0.57735, -0.57735, 0.57735) UV(0.897274, 0.508775)
V 34: Pos(7.530005, -3.8, 2.1) Norm(-0.57735, 0.57735, 0.57735) UV(0.917624, 0.508775)
V 35: Pos(7.530005, -3.8, 0.0) Norm(-0.57735, 0.57735, -0.57735) UV(0.917624, 0.937347)
V 36: Pos(7.530005, -3.8, 0.0) Norm(-0.57735, 0.57735, -0.57735) UV(0.612245, 0.857143)
V 37: Pos(7.530005, -3.8, 2.1) Norm(-0.57735, 0.57735, 0.57735) UV(0.612245, 0.428571)
V 38: Pos(8.730006, -3.8, 2.1) Norm(0.57735, 0.57735, 0.57735) UV(0.850975, 0.428571)
V 39: Pos(8.730006, -3.8, 0.0) Norm(0.57735, 0.57735, -0.57735) UV(0.850975, 0.857143)
V 40: Pos(8.730006, -3.8, 0.0) Norm(0.57735, 0.57735, -0.57735) UV(0.917624, 0.937347)
V 41: Pos(8.730006, -3.8, 2.1) Norm(0.57735, 0.57735, 0.57735) UV(0.917624, 0.508775)
V 42: Pos(8.730006, -3.9, 2.1) Norm(0.57735, -0.57735, 0.57735) UV(0.937519, 0.508775)
V 43: Pos(8.730006, -3.9, 0.0) Norm(0.57735, -0.57735, -0.57735) UV(0.937519, 0.937347)
V 44: Pos(8.730006, -3.9, 0.0) Norm(0.57735, -0.57735, -0.57735) UV(0.612245, 0.428571)
V 45: Pos(8.730006, -3.9, 2.1) Norm(0.57735, -0.57735, 0.57735) UV(0.612245, 0.0)
V 46: Pos(7.530005, -3.9, 2.1) Norm(-0.57735, -0.57735, 0.57735) UV(0.856457, 0.0)
V 47: Pos(7.530005, -3.9, 0.0) Norm(-0.57735, -0.57735, -0.57735) UV(0.856457, 0.428571)
V 48: Pos(7.530005, -3.8, 0.0) Norm(-0.57735, 0.57735, -0.57735) UV(0.524124, 0.510204)
V 49: Pos(8.730006, -3.8, 0.0) Norm(0.57735, 0.57735, -0.57735) UV(0.524124, 0.755102)
V 50: Pos(8.730006, -3.9, 0.0) Norm(0.57735, -0.57735, -0.57735) UV(0.503716, 0.755102)
V 51: Pos(7.530005, -3.9, 0.0) Norm(-0.57735, -0.57735, -0.57735) UV(0.503716, 0.510204)
V 52: Pos(8.730006, -3.8, 2.1) Norm(0.57735, 0.57735, 0.57735) UV(0.544533, 0.510204)
V 53: Pos(7.530005, -3.8, 2.1) Norm(-0.57735, 0.57735, 0.57735) UV(0.544533, 0.755102)
V 54: Pos(7.530005, -3.9, 2.1) Norm(-0.57735, -0.57735, 0.57735) UV(0.524124, 0.755102)
V 55: Pos(8.730006, -3.9, 2.1) Norm(0.57735, -0.57735, 0.57735) UV(0.524124, 0.510204)
V 56: Pos(6.880006, -5.25, 2.325) Norm(-0.57735, -0.57735, -0.57735) UV(0.336735, 0.815469)
V 57: Pos(6.880006, -5.25, 2.475) Norm(-0.57735, -0.57735, 0.57735) UV(0.306122, 0.815469)
V 58: Pos(6.880006, -3.75, 2.475) Norm(-0.57735, 0.57735, 0.57735) UV(0.306122, 0.510204)
V 59: Pos(6.880006, -3.75, 2.325) Norm(-0.57735, 0.57735, -0.57735) UV(0.336735, 0.510204)
V 60: Pos(6.880006, -3.75, 2.325) Norm(-0.57735, 0.57735, -0.57735) UV(0.958498, 0.497355)
V 61: Pos(6.880006, -3.75, 2.475) Norm(-0.57735, 0.57735, 0.57735) UV(0.927886, 0.497355)
V 62: Pos(9.380006, -3.75, 2.475) Norm(0.57735, 0.57735, 0.57735) UV(0.927886, 0.0)
V 63: Pos(9.380006, -3.75, 2.325) Norm(0.57735, 0.57735, -0.57735) UV(0.958498, 0.0)
V 64: Pos(9.380006, -3.75, 2.325) Norm(0.57735, 0.57735, -0.57735) UV(0.367347, 0.808617)
V 65: Pos(9.380006, -3.75, 2.475) Norm(0.57735, 0.57735, 0.57735) UV(0.336735, 0.808617)
V 66: Pos(9.380006, -5.25, 2.475) Norm(0.57735, -0.57735, 0.57735) UV(0.336735, 0.510204)
V 67: Pos(9.380006, -5.25, 2.325) Norm(0.57735, -0.57735, -0.57735) UV(0.367347, 0.510204)
V 68: Pos(9.380006, -5.25, 2.325) Norm(0.57735, -0.57735, -0.57735) UV(0.927886, 0.508775)
V 69: Pos(9.380006, -5.25, 2.475) Norm(0.57735, -0.57735, 0.57735) UV(0.897273, 0.508775)
V 70: Pos(6.880006, -5.25, 2.475) Norm(-0.57735, -0.57735, 0.57735) UV(0.897273, -0.0)
V 71: Pos(6.880006, -5.25, 2.325) Norm(-0.57735, -0.57735, -0.57735) UV(0.927886, -0.0)
V 72: Pos(6.880006, -3.75, 2.325) Norm(-0.57735, 0.57735, -0.57735) UV(0.306122, 0.0)
V 73: Pos(9.380006, -3.75, 2.325) Norm(0.57735, 0.57735, -0.57735) UV(0.306122, 0.510204)
V 74: Pos(9.380006, -5.25, 2.325) Norm(0.57735, -0.57735, -0.57735) UV(-0.0, 0.510204)
V 75: Pos(6.880006, -5.25, 2.325) Norm(-0.57735, -0.57735, -0.57735) UV(0.0, 0.0)
V 76: Pos(9.380006, -3.75, 2.475) Norm(0.57735, 0.57735, 0.57735) UV(0.612245, 0.0)
V 77: Pos(6.880006, -3.75, 2.475) Norm(-0.57735, 0.57735, 0.57735) UV(0.612245, 0.510204)
V 78: Pos(6.880006, -5.25, 2.475) Norm(-0.57735, -0.57735, 0.57735) UV(0.306122, 0.510204)
V 79: Pos(9.380006, -5.25, 2.475) Norm(0.57735, -0.57735, 0.57735) UV(0.306122, 0.0)
V 80: Pos(7.080006, -5.1, 0.0) Norm(-3e-06, 0.727885, -0.685699) UV(0.953355, 0.987151)
V 81: Pos(7.080006, -5.1, 2.4) Norm(-3e-06, 0.727885, 0.685699) UV(0.953355, 0.497355)
V 82: Pos(7.08976, -5.100961, 2.4) Norm(0.142, 0.713894, 0.685705) UV(0.955252, 0.497355)
V 83: Pos(7.08976, -5.100961, 0.0) Norm(0.142, 0.713894, -0.685705) UV(0.955252, 0.987151)
V 84: Pos(7.09914, -5.103806, 2.4) Norm(0.278547, 0.672481, 0.685698) UV(0.956989, 0.497355)
V 85: Pos(7.09914, -5.103806, 0.0) Norm(0.278548, 0.67248, -0.685697) UV(0.956989, 0.987151)
V 86: Pos(7.107784, -5.108427, 2.4) Norm(0.404383, 0.605212, 0.685706) UV(0.958498, 0.497355)
V 87: Pos(7.107784, -5.108427, 0.0) Norm(0.404384, 0.605212, -0.685706) UV(0.958498, 0.987151)
V 88: Pos(7.107784, -5.108427, 0.0) Norm(0.404384, 0.605212, -0.685706) UV(0.367347, 1.0)
V 89: Pos(7.107784, -5.108427, 2.4) Norm(0.404383, 0.605212, 0.685706) UV(0.367347, 0.510204)
V 90: Pos(7.115361, -5.114645, 2.4) Norm(0.514694, 0.514694, 0.685697) UV(0.368929, 0.510204)
V 91: Pos(7.115361, -5.114645, 0.0) Norm(0.514694, 0.514694, -0.685697) UV(0.368929, 1.0)
V 92: Pos(7.121579, -5.122221, 2.4) Norm(0.605217, 0.404381, 0.685703) UV(0.370719, 0.510204)
V 93: Pos(7.121579, -5.122221, 0.0) Norm(0.605217, 0.404381, -0.685703) UV(0.370719, 1.0)
V 94: Pos(7.1262, -5.130866, 2.4) Norm(0.672491, 0.278519, 0.685699) UV(0.372649, 0.510204)
V 95: Pos(7.1262, -5.130866, 0.0) Norm(0.672491, 0.278519, -0.685699) UV(0.372649, 1.0)
V 96: Pos(7.129045, -5.140245, 2.4) Norm(0.713888, 0.142003, 0.68571) UV(0.374645, 0.510204)
V 97: Pos(7.129045, -5.140245, 0.0) Norm(0.713889, 0.142002, -0.68571) UV(0.374645, 1.0)
V 98: Pos(7.130006, -5.15, 2.4) Norm(0.727893, 0.0, 0.685691) UV(0.376629, 0.510204)
V 99: Pos(7.130006, -5.15, 0.0) Norm(0.727893, 0.0, -0.685691) UV(0.376629, 1.0)
V 100: Pos(7.129045, -5.159755, 2.4) Norm(0.713888, -0.142003, 0.68571) UV(0.378526, 0.510204)
V 101: Pos(7.129045, -5.159755, 0.0) Norm(0.713889, -0.142002, -0.68571) UV(0.378526, 1.0)
V 102: Pos(7.1262, -5.169134, 2.4) Norm(0.672491, -0.278519, 0.685699) UV(0.380262, 0.510204)
V 103: Pos(7.1262, -5.169134, 0.0) Norm(0.672491, -0.278519, -0.685699) UV(0.380262, 1.0)
V 104: Pos(7.121579, -5.177779, 2.4) Norm(0.605217, -0.404381, 0.685703) UV(0.381772, 0.510204)
V 105: Pos(7.121579, -5.177779, 0.0) Norm(0.605217, -0.404381, -0.685703) UV(0.381772, 1.0)
V 106: Pos(7.121579, -5.177779, 0.0) Norm(0.605217, -0.404381, -0.685703) UV(0.958498, 0.979592)
V 107: Pos(7.121579, -5.177779, 2.4) Norm(0.605217, -0.404381, 0.685703) UV(0.958498, 0.489796)
V 108: Pos(7.115361, -5.185356, 2.4) Norm(0.514694, -0.514694, 0.685697) UV(0.959879, 0.489796)
V 109: Pos(7.115361, -5.185356, 0.0) Norm(0.514694, -0.514694, -0.685697) UV(0.959879, 0.979592)
V 110: Pos(7.107784, -5.191574, 2.4) Norm(0.404383, -0.605212, 0.685706) UV(0.961516, 0.489796)
V 111: Pos(7.107784, -5.191574, 0.0) Norm(0.404384, -0.605212, -0.685706) UV(0.961516, 0.979592)
V 112: Pos(7.09914, -5.196194, 2.4) Norm(0.278547, -0.672481, 0.685698) UV(0.963346, 0.489796)
V 113: Pos(7.09914, -5.196194, 0.0) Norm(0.278548, -0.67248, -0.685697) UV(0.963346, 0.979592)
V 114: Pos(7.08976, -5.199039, 2.4) Norm(0.142, -0.713894, 0.685705) UV(0.965298, 0.489796)
V 115: Pos(7.08976, -5.199039, 0.0) Norm(0.142, -0.713894, -0.685705) UV(0.965298, 0.979592)
V 116: Pos(7.080006, -5.2, 2.4) Norm(-3e-06, -0.727885, 0.685699) UV(0.967298, 0.489796)
V 117: Pos(7.080006, -5.2, 0.0) Norm(-3e-06, -0.727885, -0.685699) UV(0.967298, 0.979592)
V 118: Pos(7.070251, -5.199039, 2.4) Norm(-0.141995, -0.713895, 0.685705) UV(0.969268, 0.489796)
V 119: Pos(7.070251, -5.199039, 0.0) Norm(-0.141995, -0.713895, -0.685705) UV(0.969268, 0.979592)
V 120: Pos(7.060871, -5.196194, 2.4) Norm(-0.278553, -0.672477, 0.685699) UV(0.971134, 0.489796)
V 121: Pos(7.060871, -5.196194, 0.0) Norm(-0.278552, -0.672478, -0.685699) UV(0.971134, 0.979592)
V 122: Pos(7.052227, -5.191574, 2.4) Norm(-0.404396, -0.605205, 0.685705) UV(0.972823, 0.489796)
V 123: Pos(7.052227, -5.191574, 0.0) Norm(-0.404396, -0.605205, -0.685705) UV(0.972823, 0.979592)
V 124: Pos(7.04465, -5.185356, 2.4) Norm(-0.514694, -0.514694, 0.685697) UV(0.97427, 0.489796)
V 125: Pos(7.04465, -5.185356, 0.0) Norm(-0.514694, -0.514694, -0.685697) UV(0.97427, 0.979592)
V 126: Pos(7.04465, -5.185356, 0.0) Norm(-0.514694, -0.514694, -0.685697) UV(0.40914, 1.0)
V 127: Pos(7.04465, -5.185356, 2.4) Norm(-0.514694, -0.514694, 0.685697) UV(0.40914, 0.510204)
V 128: Pos(7.038432, -5.177779, 2.4) Norm(-0.605217, -0.40438, 0.685703) UV(0.410777, 0.510204)
V 129: Pos(7.038432, -5.177779, 0.0) Norm(-0.605217, -0.404381, -0.685703) UV(0.410777, 1.0)
V 130: Pos(7.033812, -5.169134, 2.4) Norm(-0.672482, -0.278545, 0.685697) UV(0.412607, 0.510204)
V 131: Pos(7.033812, -5.169134, 0.0) Norm(-0.672481, -0.278545, -0.685698) UV(0.412607, 1.0)
V 132: Pos(7.030967, -5.159755, 2.4) Norm(-0.713882, -0.14203, 0.685711) UV(0.414559, 0.510204)
V 133: Pos(7.030967, -5.159755, 0.0) Norm(-0.713882, -0.14203, -0.685712) UV(0.414559, 1.0)
V 134: Pos(7.030005, -5.15, 2.4) Norm(-0.727893, 0.0, 0.685691) UV(0.416559, 0.510204)
V 135: Pos(7.030005, -5.15, 0.0) Norm(-0.727893, 0.0, -0.685691) UV(0.416559, 1.0)
V 136: Pos(7.030967, -5.140245, 2.4) Norm(-0.713882, 0.14203, 0.685711) UV(0.41853, 0.510204)
V 137: Pos(7.030967, -5.140245, 0.0) Norm(-0.713882, 0.14203, -0.685712) UV(0.41853, 1.0)
V 138: Pos(7.033812, -5.130866, 2.4) Norm(-0.672482, 0.278545, 0.685697) UV(0.420395, 0.510204)
V 139: Pos(7.033812, -5.130866, 0.0) Norm(-0.672481, 0.278545, -0.685698) UV(0.420395, 1.0)
V 140: Pos(7.038432, -5.122221, 2.4) Norm(-0.605217, 0.40438, 0.685703) UV(0.422084, 0.510204)
V 141: Pos(7.038432, -5.122221, 0.0) Norm(-0.605217, 0.404381, -0.685703) UV(0.422084, 1.0)
V 142: Pos(7.038432, -5.122221, 0.0) Norm(-0.605217, 0.404381, -0.685703) UV(0.944073, 0.987151)
V 143: Pos(7.038432, -5.122221, 2.4) Norm(-0.605217, 0.40438, 0.685703) UV(0.944073, 0.497355)
V 144: Pos(7.04465, -5.114645, 2.4) Norm(-0.514694, 0.514694, 0.685697) UV(0.945655, 0.497355)
V 145: Pos(7.04465, -5.114645, 0.0) Norm(-0.514694, 0.514694, -0.685697) UV(0.945655, 0.987151)
V 146: Pos(7.052227, -5.108427, 2.4) Norm(-0.404396, 0.605205, 0.685705) UV(0.947445, 0.497355)
V 147: Pos(7.052227, -5.108427, 0.0) Norm(-0.404396, 0.605205, -0.685705) UV(0.947445, 0.987151)
V 148: Pos(7.060871, -5.103806, 2.4) Norm(-0.278553, 0.672477, 0.685699) UV(0.949375, 0.497355)
V 149: Pos(7.060871, -5.103806, 0.0) Norm(-0.278552, 0.672478, -0.685699) UV(0.949375, 0.987151)
V 150: Pos(7.08976, -5.100961, 2.4) Norm(0.142, 0.713894, 0.685705) UV(0.545688, 0.565789)
V 151: Pos(7.080006, -5.1, 2.4) Norm(-3e-06, 0.727885, 0.685699) UV(0.544923, 0.563941)
V 152: Pos(7.070251, -5.100961, 2.4) Norm(-0.141995, 0.713895, 0.685705) UV(0.544533, 0.561979)
V 153: Pos(7.060871, -5.103806, 2.4) Norm(-0.278553, 0.672477, 0.685699) UV(0.544533, 0.559978)
V 154: Pos(7.052227, -5.108427, 2.4) Norm(-0.404396, 0.605205, 0.685705) UV(0.544923, 0.558017)
V 155: Pos(7.04465, -5.114645, 2.4) Norm(-0.514694, 0.514694, 0.685697) UV(0.545688, 0.556169)
V 156: Pos(7.038432, -5.122221, 2.4) Norm(-0.605217, 0.40438, 0.685703) UV(0.5468, 0.554505)
V 157: Pos(7.033812, -5.130866, 2.4) Norm(-0.672482, 0.278545, 0.685697) UV(0.548214, 0.553091)
V 158: Pos(7.030967, -5.140245, 2.4) Norm(-0.713882, 0.14203, 0.685711) UV(0.549878, 0.55198)
V 159: Pos(7.030005, -5.15, 2.4) Norm(-0.727893, 0.0, 0.685691) UV(0.551726, 0.551214)
V 160: Pos(7.030967, -5.159755, 2.4) Norm(-0.713882, -0.14203, 0.685711) UV(0.553688, 0.550824)
V 161: Pos(7.033812, -5.169134, 2.4) Norm(-0.672482, -0.278545, 0.685697) UV(0.555688, 0.550824)
V 162: Pos(7.038432, -5.177779, 2.4) Norm(-0.605217, -0.40438, 0.685703) UV(0.55765, 0.551214)
V 163: Pos(7.04465, -5.185356, 2.4) Norm(-0.514694, -0.514694, 0.685697) UV(0.559498, 0.55198)
V 164: Pos(7.052227, -5.191574, 2.4) Norm(-0.404396, -0.605205, 0.685705) UV(0.561161, 0.553091)
V 165: Pos(7.060871, -5.196194, 2.4) Norm(-0.278553, -0.672477, 0.685699) UV(0.562576, 0.554506)
V 166: Pos(7.070251, -5.199039, 2.4) Norm(-0.141995, -0.713895, 0.685705) UV(0.563687, 0.556169)
V 167: Pos(7.080006, -5.2, 2.4) Norm(-3e-06, -0.727885, 0.685699) UV(0.564452, 0.558017)
V 168: Pos(7.08976, -5.199039, 2.4) Norm(0.142, -0.713894, 0.685705) UV(0.564843, 0.559979)
V 169: Pos(7.09914, -5.196194, 2.4) Norm(0.278547, -0.672481, 0.685698) UV(0.564843, 0.561979)
V 170: Pos(7.107784, -5.191574, 2.4) Norm(0.404383, -0.605212, 0.685706) UV(0.564452, 0.563941)
V 171: Pos(7.115361, -5.185356, 2.4) Norm(0.514694, -0.514694, 0.685697) UV(0.563687, 0.565789)
V 172: Pos(7.121579, -5.177779, 2.4) Norm(0.605217, -0.404381, 0.685703) UV(0.562575, 0.567452)
V 173: Pos(7.1262, -5.169134, 2.4) Norm(0.672491, -0.278519, 0.685699) UV(0.561161, 0.568867)
V 174: Pos(7.129045, -5.159755, 2.4) Norm(0.713888, -0.142003, 0.68571) UV(0.559498, 0.569978)
V 175: Pos(7.130006, -5.15, 2.4) Norm(0.727893, 0.0, 0.685691) UV(0.557649, 0.570744)
V 176: Pos(7.129045, -5.140245, 2.4) Norm(0.713888, 0.142003, 0.68571) UV(0.555688, 0.571134)
V 177: Pos(7.1262, -5.130866, 2.4) Norm(0.672491, 0.278519, 0.685699) UV(0.553687, 0.571134)
V 178: Pos(7.121579, -5.122221, 2.4) Norm(0.605217, 0.404381, 0.685703) UV(0.551725, 0.570744)
V 179: Pos(7.115361, -5.114645, 2.4) Norm(0.514694, 0.514694, 0.685697) UV(0.549877, 0.569978)
V 180: Pos(7.107784, -5.108427, 2.4) Norm(0.404383, 0.605212, 0.685706) UV(0.548214, 0.568867)
V 181: Pos(7.09914, -5.103806, 2.4) Norm(0.278547, 0.672481, 0.685698) UV(0.5468, 0.567452)
V 182: Pos(7.070251, -5.100961, 2.4) Norm(-0.141995, 0.713895, 0.685705) UV(0.951371, 0.497355)
V 183: Pos(7.070251, -5.100961, 0.0) Norm(-0.141995, 0.713895, -0.685705) UV(0.951371, 0.987151)
V 184: Pos(7.080006, -5.1, 0.0) Norm(-3e-06, 0.727885, -0.685699) UV(0.584762, 0.523321)
V 185: Pos(7.08976, -5.100961, 0.0) Norm(0.142, 0.713894, -0.685705) UV(0.583997, 0.525169)
V 186: Pos(7.09914, -5.103806, 0.0) Norm(0.278548, 0.67248, -0.685697) UV(0.582886, 0.526832)
V 187: Pos(7.107784, -5.108427, 0.0) Norm(0.404384, 0.605212, -0.685706) UV(0.581471, 0.528247)
V 188: Pos(7.115361, -5.114645, 0.0) Norm(0.514694, 0.514694, -0.685697) UV(0.579808, 0.529358)
V 189: Pos(7.121579, -5.122221, 0.0) Norm(0.605217, 0.404381, -0.685703) UV(0.57796, 0.530124)
V 190: Pos(7.1262, -5.130866, 0.0) Norm(0.672491, 0.278519, -0.685699) UV(0.575998, 0.530514)
V 191: Pos(7.129045, -5.140245, 0.0) Norm(0.713889, 0.142002, -0.68571) UV(0.573998, 0.530514)
V 192: Pos(7.130006, -5.15, 0.0) Norm(0.727893, 0.0, -0.685691) UV(0.572036, 0.530124)
V 193: Pos(7.129045, -5.159755, 0.0) Norm(0.713889, -0.142002, -0.68571) UV(0.570188, 0.529358)
V 194: Pos(7.1262, -5.169134, 0.0) Norm(0.672491, -0.278519, -0.685699) UV(0.568524, 0.528247)
V 195: Pos(7.121579, -5.177779, 0.0) Norm(0.605217, -0.404381, -0.685703) UV(0.56711, 0.526833)
V 196: Pos(7.115361, -5.185356, 0.0) Norm(0.514694, -0.514694, -0.685697) UV(0.565998, 0.525169)
V 197: Pos(7.107784, -5.191574, 0.0) Norm(0.404384, -0.605212, -0.685706) UV(0.565233, 0.523321)
V 198: Pos(7.09914, -5.196194, 0.0) Norm(0.278548, -0.67248, -0.685697) UV(0.564843, 0.521359)
V 199: Pos(7.08976, -5.199039, 0.0) Norm(0.142, -0.713894, -0.685705) UV(0.564843, 0.519359)
V 200: Pos(7.080006, -5.2, 0.0) Norm(-3e-06, -0.727885, -0.685699) UV(0.565233, 0.517397)
V 201: Pos(7.070251, -5.199039, 0.0) Norm(-0.141995, -0.713895, -0.685705) UV(0.565998, 0.515549)
V 202: Pos(7.060871, -5.196194, 0.0) Norm(-0.278552, -0.672478, -0.685699) UV(0.56711, 0.513886)
V 203: Pos(7.052227, -5.191574, 0.0) Norm(-0.404396, -0.605205, -0.685705) UV(0.568524, 0.512471)
V 204: Pos(7.04465, -5.185356, 0.0) Norm(-0.514694, -0.514694, -0.685697) UV(0.570187, 0.51136)
V 205: Pos(7.038432, -5.177779, 0.0) Norm(-0.605217, -0.404381, -0.685703) UV(0.572035, 0.510594)
V 206: Pos(7.033812, -5.169134, 0.0) Norm(-0.672481, -0.278545, -0.685698) UV(0.573997, 0.510204)
V 207: Pos(7.030967, -5.159755, 0.0) Norm(-0.713882, -0.14203, -0.685712) UV(0.575997, 0.510204)
V 208: Pos(7.030005, -5.15, 0.0) Norm(-0.727893, 0.0, -0.685691) UV(0.577959, 0.510594)
V 209: Pos(7.030967, -5.140245, 0.0) Norm(-0.713882, 0.14203, -0.685712) UV(0.579808, 0.51136)
V 210: Pos(7.033812, -5.130866, 0.0) Norm(-0.672481, 0.278545, -0.685698) UV(0.581471, 0.512471)
V 211: Pos(7.038432, -5.122221, 0.0) Norm(-0.605217, 0.404381, -0.685703) UV(0.582885, 0.513885)
V 212: Pos(7.04465, -5.114645, 0.0) Norm(-0.514694, 0.514694, -0.685697) UV(0.583997, 0.515549)
V 213: Pos(7.052227, -5.108427, 0.0) Norm(-0.404396, 0.605205, -0.685705) UV(0.584762, 0.517397)
V 214: Pos(7.060871, -5.103806, 0.0) Norm(-0.278552, 0.672478, -0.685699) UV(0.585153, 0.519359)
V 215: Pos(7.070251, -5.100961, 0.0) Norm(-0.141995, 0.713895, -0.685705) UV(0.585153, 0.521359)
V 216: Pos(9.180006, -5.1, 0.0) Norm(-6e-06, 0.727884, -0.6857) UV(0.983552, 0.489796)
V 217: Pos(9.180006, -5.1, 2.4) Norm(-6e-06, 0.727884, 0.6857) UV(0.983552, 0.0)
V 218: Pos(9.189761, -5.100961, 2.4) Norm(0.142006, 0.713897, 0.685701) UV(0.985449, 0.0)
V 219: Pos(9.189761, -5.100961, 0.0) Norm(0.142006, 0.713897, -0.685701) UV(0.985449, 0.489796)
V 220: Pos(9.199141, -5.103806, 2.4) Norm(0.278554, 0.672475, 0.685701) UV(0.987185, 0.0)
V 221: Pos(9.199141, -5.103806, 0.0) Norm(0.278555, 0.672475, -0.685701) UV(0.987185, 0.489796)
V 222: Pos(9.207785, -5.108427, 2.4) Norm(0.404383, 0.605212, 0.685706) UV(0.988695, 0.0)
V 223: Pos(9.207785, -5.108427, 0.0) Norm(0.404384, 0.605212, -0.685706) UV(0.988695, 0.489796)
V 224: Pos(9.207785, -5.108427, 0.0) Norm(0.404384, 0.605212, -0.685706) UV(0.381772, 1.0)
V 225: Pos(9.207785, -5.108427, 2.4) Norm(0.404383, 0.605212, 0.685706) UV(0.381772, 0.510204)
V 226: Pos(9.215362, -5.114645, 2.4) Norm(0.514694, 0.514694, 0.685697) UV(0.383354, 0.510204)
V 227: Pos(9.215362, -5.114645, 0.0) Norm(0.514694, 0.514694, -0.685697) UV(0.383354, 1.0)
V 228: Pos(9.22158, -5.122221, 2.4) Norm(0.605217, 0.404381, 0.685703) UV(0.385144, 0.510204)
V 229: Pos(9.22158, -5.122221, 0.0) Norm(0.605217, 0.404381, -0.685703) UV(0.385144, 1.0)
V 230: Pos(9.2262, -5.130866, 2.4) Norm(0.672462, 0.278568, 0.685708) UV(0.387074, 0.510204)
V 231: Pos(9.2262, -5.130866, 0.0) Norm(0.672462, 0.278568, -0.685708) UV(0.387074, 1.0)
V 232: Pos(9.229046, -5.140245, 2.4) Norm(0.713905, 0.142004, 0.685693) UV(0.38907, 0.510204)
V 233: Pos(9.229046, -5.140245, 0.0) Norm(0.713905, 0.142004, -0.685692) UV(0.38907, 1.0)
V 234: Pos(9.230006, -5.15, 2.4) Norm(0.727876, 0.0, 0.685709) UV(0.391054, 0.510204)
V 235: Pos(9.230006, -5.15, 0.0) Norm(0.727876, 0.0, -0.685709) UV(0.391054, 1.0)
V 236: Pos(9.229046, -5.159755, 2.4) Norm(0.713905, -0.142004, 0.685693) UV(0.392951, 0.510204)
V 237: Pos(9.229046, -5.159755, 0.0) Norm(0.713905, -0.142004, -0.685692) UV(0.392951, 1.0)
V 238: Pos(9.2262, -5.169134, 2.4) Norm(0.672462, -0.278568, 0.685708) UV(0.394687, 0.510204)
V 239: Pos(9.2262, -5.169134, 0.0) Norm(0.672462, -0.278568, -0.685708) UV(0.394687, 1.0)
V 240: Pos(9.22158, -5.177779, 2.4) Norm(0.605217, -0.404381, 0.685703) UV(0.396197, 0.510204)
V 241: Pos(9.22158, -5.177779, 0.0) Norm(0.605217, -0.404381, -0.685703) UV(0.396197, 1.0)
V 242: Pos(9.22158, -5.177779, 0.0) Norm(0.605217, -0.404381, -0.685703) UV(0.958498, 0.489796)
V 243: Pos(9.22158, -5.177779, 2.4) Norm(0.605217, -0.404381, 0.685703) UV(0.958498, 0.0)
V 244: Pos(9.215362, -5.185356, 2.4) Norm(0.514694, -0.514694, 0.685697) UV(0.959879, 0.0)
V 245: Pos(9.215362, -5.185356, 0.0) Norm(0.514694, -0.514694, -0.685697) UV(0.959879, 0.489796)
V 246: Pos(9.207785, -5.191574, 2.4) Norm(0.404383, -0.605212, 0.685706) UV(0.961516, 0.0)
V 247: Pos(9.207785, -5.191574, 0.0) Norm(0.404384, -0.605212, -0.685706) UV(0.961516, 0.489796)
V 248: Pos(9.199141, -5.196194, 2.4) Norm(0.278554, -0.672475, 0.685701) UV(0.963346, 0.0)
V 249: Pos(9.199141, -5.196194, 0.0) Norm(0.278555, -0.672475, -0.685701) UV(0.963346, 0.489796)
V 250: Pos(9.189761, -5.199039, 2.4) Norm(0.142006, -0.713897, 0.685701) UV(0.965298, 0.0)
V 251: Pos(9.189761, -5.199039, 0.0) Norm(0.142006, -0.713897, -0.685701) UV(0.965298, 0.489796)
V 252: Pos(9.180006, -5.2, 2.4) Norm(-6e-06, -0.727884, 0.6857) UV(0.967298, 0.0)
V 253: Pos(9.180006, -5.2, 0.0) Norm(-6e-06, -0.727884, -0.6857) UV(0.967298, 0.489796)
V 254: Pos(9.170252, -5.199039, 2.4) Norm(-0.142012, -0.713895, 0.685702) UV(0.969268, 0.0)
V 255: Pos(9.170252, -5.199039, 0.0) Norm(-0.142012, -0.713895, -0.685702) UV(0.969268, 0.489796)
V 256: Pos(9.160872, -5.196194, 2.4) Norm(-0.27854, -0.672476, 0.685705) UV(0.971134, 0.0)
V 257: Pos(9.160872, -5.196194, 0.0) Norm(-0.27854, -0.672476, -0.685706) UV(0.971134, 0.489796)
V 258: Pos(9.152227, -5.191574, 2.4) Norm(-0.404375, -0.605223, 0.685701) UV(0.972823, 0.0)
V 259: Pos(9.152227, -5.191574, 0.0) Norm(-0.404375, -0.605223, -0.685701) UV(0.972823, 0.489796)
V 260: Pos(9.14465, -5.185356, 2.4) Norm(-0.514694, -0.514694, 0.685697) UV(0.97427, 0.0)
V 261: Pos(9.14465, -5.185356, 0.0) Norm(-0.514694, -0.514694, -0.685697) UV(0.97427, 0.489796)
V 262: Pos(9.14465, -5.185356, 0.0) Norm(-0.514694, -0.514694, -0.685697) UV(0.396197, 1.0)
V 263: Pos(9.14465, -5.185356, 2.4) Norm(-0.514694, -0.514694, 0.685697) UV(0.396197, 0.510204)
V 264: Pos(9.138433, -5.177779, 2.4) Norm(-0.605217, -0.40438, 0.685703) UV(0.397834, 0.510204)
V 265: Pos(9.138433, -5.177779, 0.0) Norm(-0.605217, -0.404381, -0.685703) UV(0.397834, 1.0)
V 266: Pos(9.133812, -5.169134, 2.4) Norm(-0.672482, -0.278545, 0.685697) UV(0.399663, 0.510204)
V 267: Pos(9.133812, -5.169134, 0.0) Norm(-0.672481, -0.278545, -0.685698) UV(0.399663, 1.0)
V 268: Pos(9.130967, -5.159755, 2.4) Norm(-0.713882, -0.14203, 0.685711) UV(0.401616, 0.510204)
V 269: Pos(9.130967, -5.159755, 0.0) Norm(-0.713882, -0.14203, -0.685712) UV(0.401616, 1.0)
V 270: Pos(9.130006, -5.15, 2.4) Norm(-0.727893, 0.0, 0.685691) UV(0.403616, 0.510204)
V 271: Pos(9.130006, -5.15, 0.0) Norm(-0.727893, 0.0, -0.685691) UV(0.403616, 1.0)
V 272: Pos(9.130967, -5.140245, 2.4) Norm(-0.713882, 0.14203, 0.685711) UV(0.405586, 0.510204)
V 273: Pos(9.130967, -5.140245, 0.0) Norm(-0.713882, 0.14203, -0.685712) UV(0.405586, 1.0)
V 274: Pos(9.133812, -5.130866, 2.4) Norm(-0.672482, 0.278545, 0.685697) UV(0.407451, 0.510204)
V 275: Pos(9.133812, -5.130866, 0.0) Norm(-0.672481, 0.278545, -0.685698) UV(0.407451, 1.0)
V 276: Pos(9.138433, -5.122221, 2.4) Norm(-0.605217, 0.40438, 0.685703) UV(0.40914, 0.510204)
V 277: Pos(9.138433, -5.122221, 0.0) Norm(-0.605217, 0.404381, -0.685703) UV(0.40914, 1.0)
V 278: Pos(9.138433, -5.122221, 0.0) Norm(-0.605217, 0.404381, -0.685703) UV(0.97427, 0.489796)
V 279: Pos(9.138433, -5.122221, 2.4) Norm(-0.605217, 0.40438, 0.685703) UV(0.97427, 0.0)
V 280: Pos(9.14465, -5.114645, 2.4) Norm(-0.514694, 0.514694, 0.685697) UV(0.975852, 0.0)
V 281: Pos(9.14465, -5.114645, 0.0) Norm(-0.514694, 0.514694, -0.685697) UV(0.975852, 0.489796)
V 282: Pos(9.152227, -5.108427, 2.4) Norm(-0.404375, 0.605223, 0.685701) UV(0.977642, 0.0)
V 283: Pos(9.152227, -5.108427, 0.0) Norm(-0.404375, 0.605223, -0.685701) UV(0.977642, 0.489796)
V 284: Pos(9.160872, -5.103806, 2.4) Norm(-0.27854, 0.672476, 0.685705) UV(0.979572, 0.0)
V 285: Pos(9.160872, -5.103806, 0.0) Norm(-0.27854, 0.672476, -0.685706) UV(0.979572, 0.489796)
V 286: Pos(9.189761, -5.100961, 2.4) Norm(0.142006, 0.713897, 0.685701) UV(0.561161, 0.528247)
V 287: Pos(9.180006, -5.1, 2.4) Norm(-6e-06, 0.727884, 0.6857) UV(0.559498, 0.529358)
V 288: Pos(9.170252, -5.100961, 2.4) Norm(-0.142012, 0.713895, 0.685702) UV(0.55765, 0.530124)
V 289: Pos(9.160872, -5.103806, 2.4) Norm(-0.27854, 0.672476, 0.685705) UV(0.555688, 0.530514)
V 290: Pos(9.152227, -5.108427, 2.4) Norm(-0.404375, 0.605223, 0.685701) UV(0.553688, 0.530514)
V 291: Pos(9.14465, -5.114645, 2.4) Norm(-0.514694, 0.514694, 0.685697) UV(0.551726, 0.530124)
V 292: Pos(9.138433, -5.122221, 2.4) Norm(-0.605217, 0.40438, 0.685703) UV(0.549878, 0.529358)
V 293: Pos(9.133812, -5.130866, 2.4) Norm(-0.672482, 0.278545, 0.685697) UV(0.548214, 0.528247)
V 294: Pos(9.130967, -5.140245, 2.4) Norm(-0.713882, 0.14203, 0.685711) UV(0.5468, 0.526833)
V 295: Pos(9.130006, -5.15, 2.4) Norm(-0.727893, 0.0, 0.685691) UV(0.545689, 0.525169)
V 296: Pos(9.130967, -5.159755, 2.4) Norm(-0.713882, -0.14203, 0.685711) UV(0.544923, 0.523321)
V 297: Pos(9.133812, -5.169134, 2.4) Norm(-0.672482, -0.278545, 0.685697) UV(0.544533, 0.521359)
V 298: Pos(9.138433, -5.177779, 2.4) Norm(-0.605217, -0.40438, 0.685703) UV(0.544533, 0.519359)
V 299: Pos(9.14465, -5.185356, 2.4) Norm(-0.514694, -0.514694, 0.685697) UV(0.544923, 0.517397)
V 300: Pos(9.152227, -5.191574, 2.4) Norm(-0.404375, -0.605223, 0.685701) UV(0.545688, 0.515549)
V 301: Pos(9.160872, -5.196194, 2.4) Norm(-0.27854, -0.672476, 0.685705) UV(0.5468, 0.513886)
V 302: Pos(9.170252, -5.199039, 2.4) Norm(-0.142012, -0.713895, 0.685702) UV(0.548214, 0.512471)
V 303: Pos(9.180006, -5.2, 2.4) Norm(-6e-06, -0.727884, 0.6857) UV(0.549877, 0.51136)
V 304: Pos(9.189761, -5.199039, 2.4) Norm(0.142006, -0.713897, 0.685701) UV(0.551726, 0.510594)
V 305: Pos(9.199141, -5.196194, 2.4) Norm(0.278554, -0.672475, 0.685701) UV(0.553687, 0.510204)
V 306: Pos(9.207785, -5.191574, 2.4) Norm(0.404383, -0.605212, 0.685706) UV(0.555688, 0.510204)
V 307: Pos(9.215362, -5.185356, 2.4) Norm(0.514694, -0.514694, 0.685697) UV(0.55765, 0.510594)
V 308: Pos(9.22158, -5.177779, 2.4) Norm(0.605217, -0.404381, 0.685703) UV(0.559498, 0.51136)
V 309: Pos(9.2262, -5.169134, 2.4) Norm(0.672462, -0.278568, 0.685708) UV(0.561161, 0.512471)
V 310: Pos(9.229046, -5.159755, 2.4) Norm(0.713905, -0.142004, 0.685693) UV(0.562576, 0.513885)
V 311: Pos(9.230006, -5.15, 2.4) Norm(0.727876, 0.0, 0.685709) UV(0.563687, 0.515549)
V 312: Pos(9.229046, -5.140245, 2.4) Norm(0.713905, 0.142004, 0.685693) UV(0.564452, 0.517397)
V 313: Pos(9.2262, -5.130866, 2.4) Norm(0.672462, 0.278568, 0.685708) UV(0.564843, 0.519359)
V 314: Pos(9.22158, -5.122221, 2.4) Norm(0.605217, 0.404381, 0.685703) UV(0.564843, 0.521359)
V 315: Pos(9.215362, -5.114645, 2.4) Norm(0.514694, 0.514694, 0.685697) UV(0.564452, 0.523321)
V 316: Pos(9.207785, -5.108427, 2.4) Norm(0.404383, 0.605212, 0.685706) UV(0.563687, 0.525169)
V 317: Pos(9.199141, -5.103806, 2.4) Norm(0.278554, 0.672475, 0.685701) UV(0.562576, 0.526832)
V 318: Pos(9.170252, -5.100961, 2.4) Norm(-0.142012, 0.713895, 0.685702) UV(0.981568, 0.0)
V 319: Pos(9.170252, -5.100961, 0.0) Norm(-0.142012, 0.713895, -0.685702) UV(0.981568, 0.489796)
V 320: Pos(9.180006, -5.1, 0.0) Norm(-6e-06, 0.727884, -0.6857) UV(0.548214, 0.548557)
V 321: Pos(9.189761, -5.100961, 0.0) Norm(0.142006, 0.713897, -0.685701) UV(0.5468, 0.547142)
V 322: Pos(9.199141, -5.103806, 0.0) Norm(0.278555, 0.672475, -0.685701) UV(0.545688, 0.545479)
V 323: Pos(9.207785, -5.108427, 0.0) Norm(0.404384, 0.605212, -0.685706) UV(0.544923, 0.543631)
V 324: Pos(9.215362, -5.114645, 0.0) Norm(0.514694, 0.514694, -0.685697) UV(0.544533, 0.541669)
V 325: Pos(9.22158, -5.122221, 0.0) Norm(0.605217, 0.404381, -0.685703) UV(0.544533, 0.539669)
V 326: Pos(9.2262, -5.130866, 0.0) Norm(0.672462, 0.278568, -0.685708) UV(0.544923, 0.537707)
V 327: Pos(9.229046, -5.140245, 0.0) Norm(0.713905, 0.142004, -0.685692) UV(0.545688, 0.535859)
V 328: Pos(9.230006, -5.15, 0.0) Norm(0.727876, 0.0, -0.685709) UV(0.5468, 0.534196)
V 329: Pos(9.229046, -5.159755, 0.0) Norm(0.713905, -0.142004, -0.685692) UV(0.548214, 0.532781)
V 330: Pos(9.2262, -5.169134, 0.0) Norm(0.672462, -0.278568, -0.685708) UV(0.549877, 0.53167)
V 331: Pos(9.22158, -5.177779, 0.0) Norm(0.605217, -0.404381, -0.685703) UV(0.551725, 0.530904)
V 332: Pos(9.215362, -5.185356, 0.0) Norm(0.514694, -0.514694, -0.685697) UV(0.553687, 0.530514)
V 333: Pos(9.207785, -5.191574, 0.0) Norm(0.404384, -0.605212, -0.685706) UV(0.555687, 0.530514)
V 334: Pos(9.199141, -5.196194, 0.0) Norm(0.278555, -0.672475, -0.685701) UV(0.557649, 0.530904)
V 335: Pos(9.189761, -5.199039, 0.0) Norm(0.142006, -0.713897, -0.685701) UV(0.559497, 0.531669)
V 336: Pos(9.180006, -5.2, 0.0) Norm(-6e-06, -0.727884, -0.6857) UV(0.561161, 0.532781)
V 337: Pos(9.170252, -5.199039, 0.0) Norm(-0.142012, -0.713895, -0.685702) UV(0.562575, 0.534195)
V 338: Pos(9.160872, -5.196194, 0.0) Norm(-0.27854, -0.672476, -0.685706) UV(0.563687, 0.535858)
V 339: Pos(9.152227, -5.191574, 0.0) Norm(-0.404375, -0.605223, -0.685701) UV(0.564452, 0.537707)
V 340: Pos(9.14465, -5.185356, 0.0) Norm(-0.514694, -0.514694, -0.685697) UV(0.564843, 0.539669)
V 341: Pos(9.138433, -5.177779, 0.0) Norm(-0.605217, -0.404381, -0.685703) UV(0.564843, 0.541669)
V 342: Pos(9.133812, -5.169134, 0.0) Norm(-0.672481, -0.278545, -0.685698) UV(0.564452, 0.543631)
V 343: Pos(9.130967, -5.159755, 0.0) Norm(-0.713882, -0.14203, -0.685712) UV(0.563687, 0.545479)
V 344: Pos(9.130006, -5.15, 0.0) Norm(-0.727893, 0.0, -0.685691) UV(0.562576, 0.547142)
V 345: Pos(9.130967, -5.140245, 0.0) Norm(-0.713882, 0.14203, -0.685712) UV(0.561161, 0.548557)
V 346: Pos(9.133812, -5.130866, 0.0) Norm(-0.672481, 0.278545, -0.685698) UV(0.559498, 0.549668)
V 347: Pos(9.138433, -5.122221, 0.0) Norm(-0.605217, 0.404381, -0.685703) UV(0.55765, 0.550434)
V 348: Pos(9.14465, -5.114645, 0.0) Norm(-0.514694, 0.514694, -0.685697) UV(0.555688, 0.550824)
V 349: Pos(9.152227, -5.108427, 0.0) Norm(-0.404375, 0.605223, -0.685701) UV(0.553688, 0.550824)
V 350: Pos(9.160872, -5.103806, 0.0) Norm(-0.27854, 0.672476, -0.685706) UV(0.551726, 0.550434)
V 351: Pos(9.170252, -5.100961, 0.0) Norm(-0.142012, 0.713895, -0.685702) UV(0.549878, 0.549668)
===Triangles (Indices): 294
Tri: 0 1 2
Tri: 0 2 3
Tri: 4 5 6
Tri: 4 6 7
Tri: 8 9 10
Tri: 8 10 11
Tri: 12 13 14
Tri: 12 14 15
Tri: 16 17 18
Tri: 16 18 19
Tri: 20 21 22
Tri: 20 22 23
Tri: 24 25 26
Tri: 24 26 27
Tri: 27 26 28
Tri: 27 28 29
Tri: 29 28 30
Tri: 29 30 31
Tri: 31 30 25
Tri: 31 25 24
Tri: 28 26 25
Tri: 28 25 30
Tri: 32 33 34
Tri: 32 34 35
Tri: 36 37 38
Tri: 36 38 39
Tri: 40 41 42
Tri: 40 42 43
Tri: 44 45 46
Tri: 44 46 47
Tri: 48 49 50
Tri: 48 50 51
Tri: 52 53 54
Tri: 52 54 55
Tri: 56 57 58
Tri: 56 58 59
Tri: 60 61 62
Tri: 60 62 63
Tri: 64 65 66
Tri: 64 66 67
Tri: 68 69 70
Tri: 68 70 71
Tri: 72 73 74
Tri: 72 74 75
Tri: 76 77 78
Tri: 76 78 79
Tri: 80 81 82
Tri: 80 82 83
Tri: 83 82 84
Tri: 83 84 85
Tri: 85 84 86
Tri: 85 86 87
Tri: 88 89 90
Tri: 88 90 91
Tri: 91 90 92
Tri: 91 92 93
Tri: 93 92 94
Tri: 93 94 95
Tri: 95 94 96
Tri: 95 96 97
Tri: 97 96 98
Tri: 97 98 99
Tri: 99 98 100
Tri: 99 100 101
Tri: 101 100 102
Tri: 101 102 103
Tri: 103 102 104
Tri: 103 104 105
Tri: 106 107 108
Tri: 106 108 109
Tri: 109 108 110
Tri: 109 110 111
Tri: 111 110 112
Tri: 111 112 113
Tri: 113 112 114
Tri: 113 114 115
Tri: 115 114 116
Tri: 115 116 117
Tri: 117 116 118
Tri: 117 118 119
Tri: 119 118 120
Tri: 119 120 121
Tri: 121 120 122
Tri: 121 122 123
Tri: 123 122 124
Tri: 123 124 125
Tri: 126 127 128
Tri: 126 128 129
Tri: 129 128 130
Tri: 129 130 131
Tri: 131 130 132
Tri: 131 132 133
Tri: 133 132 134
Tri: 133 134 135
Tri: 135 134 136
Tri: 135 136 137
Tri: 137 136 138
Tri: 137 138 139
Tri: 139 138 140
Tri: 139 140 141
Tri: 142 143 144
Tri: 142 144 145
Tri: 145 144 146
Tri: 145 146 147
Tri: 147 146 148
Tri: 147 148 149
Tri: 150 151 152
Tri: 150 152 153
Tri: 150 153 154
Tri: 150 154 155
Tri: 150 155 156
Tri: 150 156 157
Tri: 150 157 158
Tri: 150 158 159
Tri: 150 159 160
Tri: 150 160 161
Tri: 150 161 162
Tri: 150 162 163
Tri: 150 163 164
Tri: 150 164 165
Tri: 150 165 166
Tri: 150 166 167
Tri: 150 167 168
Tri: 150 168 169
Tri: 150 169 170
Tri: 150 170 171
Tri: 150 171 172
Tri: 150 172 173
Tri: 150 173 174
Tri: 150 174 175
Tri: 150 175 176
Tri: 150 176 177
Tri: 150 177 178
Tri: 150 178 179
Tri: 150 179 180
Tri: 150 180 181
Tri: 149 148 182
Tri: 149 182 183
Tri: 183 182 81
Tri: 183 81 80
Tri: 184 185 186
Tri: 184 186 187
Tri: 184 187 188
Tri: 184 188 189
Tri: 184 189 190
Tri: 184 190 191
Tri: 184 191 192
Tri: 184 192 193
Tri: 184 193 194
Tri: 184 194 195
Tri: 184 195 196
Tri: 184 196 197
Tri: 184 197 198
Tri: 184 198 199
Tri: 184 199 200
Tri: 184 200 201
Tri: 184 201 202
Tri: 184 202 203
Tri: 184 203 204
Tri: 184 204 205
Tri: 184 205 206
Tri: 184 206 207
Tri: 184 207 208
Tri: 184 208 209
Tri: 184 209 210
Tri: 184 210 211
Tri: 184 211 212
Tri: 184 212 213
Tri: 184 213 214
Tri: 184 214 215
Tri: 216 217 218
Tri: 216 218 219
Tri: 219 218 220
Tri: 219 220 221
Tri: 221 220 222
Tri: 221 222 223
Tri: 224 225 226
Tri: 224 226 227
Tri: 227 226 228
Tri: 227 228 229
Tri: 229 228 230
Tri: 229 230 231
Tri: 231 230 232
Tri: 231 232 233
Tri: 233 232 234
Tri: 233 234 235
Tri: 235 234 236
Tri: 235 236 237
Tri: 237 236 238
Tri: 237 238 239
Tri: 239 238 240
Tri: 239 240 241
Tri: 242 243 244
Tri: 242 244 245
Tri: 245 244 246
Tri: 245 246 247
Tri: 247 246 248
Tri: 247 248 249
Tri: 249 248 250
Tri: 249 250 251
Tri: 251 250 252
Tri: 251 252 253
Tri: 253 252 254
Tri: 253 254 255
Tri: 255 254 256
Tri: 255 256 257
Tri: 257 256 258
Tri: 257 258 259
Tri: 259 258 260
Tri: 259 260 261
Tri: 262 263 264
Tri: 262 264 265
Tri: 265 264 266
Tri: 265 266 267
Tri: 267 266 268
Tri: 267 268 269
Tri: 269 268 270
Tri: 269 270 271
Tri: 271 270 272
Tri: 271 272 273
Tri: 273 272 274
Tri: 273 274 275
Tri: 275 274 276
Tri: 275 276 277
Tri: 278 279 280
Tri: 278 280 281
Tri: 281 280 282
Tri: 281 282 283
Tri: 283 282 284
Tri: 283 284 285
Tri: 286 287 288
Tri: 286 288 289
Tri: 286 289 290
Tri: 286 290 291
Tri: 286 291 292
Tri: 286 292 293
Tri: 286 293 294
Tri: 286 294 295
Tri: 286 295 296
Tri: 286 296 297
Tri: 286 297 298
Tri: 286 298 299
Tri: 286 299 300
Tri: 286 300 301
Tri: 286 301 302
Tri: 286 302 303
Tri: 286 303 304
Tri: 286 304 305
Tri: 286 305 306
Tri: 286 306 307
Tri: 286 307 308
Tri: 286 308 309
Tri: 286 309 310
Tri: 286 310 311
Tri: 286 311 312
Tri: 286 312 313
Tri: 286 313 314
Tri: 286 314 315
Tri: 286 315 316
Tri: 286 316 317
Tri: 285 284 318
Tri: 285 318 319
Tri: 319 318 217
Tri: 319 217 216
Tri: 320 321 322
Tri: 320 322 323
Tri: 320 323 324
Tri: 320 324 325
Tri: 320 325 326
Tri: 320 326 327
Tri: 320 327 328
Tri: 320 328 329
Tri: 320 329 330
Tri: 320 330 331
Tri: 320 331 332
Tri: 320 332 333
Tri: 320 333 334
Tri: 320 334 335
Tri: 320 335 336
Tri: 320 336 337
Tri: 320 337 338
Tri: 320 338 339
Tri: 320 339 340
Tri: 320 340 341
Tri: 320 341 342
Tri: 320 342 343
Tri: 320 343 344
Tri: 320 344 345
Tri: 320 345 346
Tri: 320 346 347
Tri: 320 347 348
Tri: 320 348 349
Tri: 320 349 350
Tri: 320 350 351

BIN
resources/w/exterior/tree001.png (Stored with Git LFS) Normal file

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

BIN
resources/w/exterior/tree_source001.png (Stored with Git LFS) Normal file

Binary file not shown.

View File

@ -421,8 +421,10 @@ void Character::draw(Renderer& renderer) {
auto it = animations.find(drawState);
if (it == animations.end()) return;
renderer.shaderManager.PushShader(defaultShaderName);
renderer.shaderManager.PushShader("fog");
renderer.RenderUniform1i(textureUniformName, 0);
const float playerEyePos[3] = { 0.0f, 0.0f, -Environment::zoom };
renderer.RenderUniform3fv("uPlayerEyePos", playerEyePos);
renderer.PushPerspectiveProjectionMatrix(1.0 / 1.5,
static_cast<float>(Environment::width) / static_cast<float>(Environment::height),
@ -473,11 +475,13 @@ void Character::drawGpuSkinning(Renderer& renderer) {
if (anim.gpuSkinningShaderData.skinningMatrices.empty()) return;
}
static const std::string skinningShaderName = "skinning";
static const std::string skinningShaderName = "fog_skinning";
static const std::string boneMatricesUniform = "uBoneMatrices[0]";
renderer.shaderManager.PushShader(skinningShaderName);
renderer.RenderUniform1i(textureUniformName, 0);
const float playerEyePosSkin[3] = { 0.0f, 0.0f, -Environment::zoom };
renderer.RenderUniform3fv("uPlayerEyePos", playerEyePosSkin);
renderer.PushPerspectiveProjectionMatrix(1.0 / 1.5,
static_cast<float>(Environment::width) / static_cast<float>(Environment::height),
@ -505,8 +509,9 @@ void Character::drawGpuSkinning(Renderer& renderer) {
renderer.PopMatrix();
renderer.shaderManager.PushShader(defaultShaderName);
renderer.shaderManager.PushShader("fog");
renderer.RenderUniform1i(textureUniformName, 0);
renderer.RenderUniform3fv("uPlayerEyePos", playerEyePosSkin);
drawAttachedWeapon(renderer);
renderer.shaderManager.PopShader();
@ -688,13 +693,15 @@ void Character::drawCpuWithShadow(Renderer& renderer, const Eigen::Matrix4f& lig
auto it = animations.find(drawState);
if (it == animations.end()) return;
static const std::string shadowShader = "default_shadow";
static const std::string shadowShader = "fog_shadow";
renderer.shaderManager.PushShader(shadowShader);
renderer.RenderUniform1i(textureUniformName, 0);
renderer.RenderUniform1i("uShadowMap", 1);
renderer.RenderUniformMatrix4fv("uLightFromCamera", false, lightFromCamera.data());
renderer.RenderUniform3fv("uLightDir", lightDirCamera.data());
const float playerEyePosShadow[3] = { 0.0f, 0.0f, -Environment::zoom };
renderer.RenderUniform3fv("uPlayerEyePos", playerEyePosShadow);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, shadowMapTex);
@ -724,8 +731,9 @@ void Character::drawCpuWithShadow(Renderer& renderer, const Eigen::Matrix4f& lig
renderer.PopMatrix();
renderer.shaderManager.PushShader(defaultShaderName);
renderer.shaderManager.PushShader("fog");
renderer.RenderUniform1i(textureUniformName, 0);
renderer.RenderUniform3fv("uPlayerEyePos", playerEyePosShadow);
drawAttachedWeapon(renderer);
renderer.shaderManager.PopShader();
@ -744,7 +752,7 @@ void Character::drawGpuSkinningWithShadow(Renderer& renderer, const Eigen::Matri
CheckGlError(__FILE__, __LINE__);
static const std::string skinningShadowShader = "skinning_shadow";
static const std::string skinningShadowShader = "fog_skinning_shadow";
static const std::string boneMatricesUniform = "uBoneMatrices[0]";
renderer.shaderManager.PushShader(skinningShadowShader);
@ -752,6 +760,8 @@ void Character::drawGpuSkinningWithShadow(Renderer& renderer, const Eigen::Matri
renderer.RenderUniform1i("uShadowMap", 1);
renderer.RenderUniformMatrix4fv("uLightFromCamera", false, lightFromCamera.data());
renderer.RenderUniform3fv("uLightDir", lightDirCamera.data());
const float playerEyePosSkinShadow[3] = { 0.0f, 0.0f, -Environment::zoom };
renderer.RenderUniform3fv("uPlayerEyePos", playerEyePosSkinShadow);
CheckGlError(__FILE__, __LINE__);
@ -789,8 +799,9 @@ void Character::drawGpuSkinningWithShadow(Renderer& renderer, const Eigen::Matri
renderer.PopMatrix();
renderer.shaderManager.PushShader(defaultShaderName);
renderer.shaderManager.PushShader("fog");
renderer.RenderUniform1i(textureUniformName, 0);
renderer.RenderUniform3fv("uPlayerEyePos", playerEyePosSkinShadow);
drawAttachedWeapon(renderer);
renderer.shaderManager.PopShader();

View File

@ -24,12 +24,12 @@
namespace ZL
{
void set_Texture(Character& npc, TextureDataStruct& texture)
void set_Texture(Character& npc, const TextureDataStruct& texture)
{
auto tt = std::make_shared<Texture>(texture);
npc.setTexture(tt);
}
void set_Texture(Character& npc, const std::string& meshName, TextureDataStruct& texture)
void set_Texture(Character& npc, const std::string& meshName, const TextureDataStruct& texture)
{
auto tt = std::make_shared<Texture>(texture);
npc.setTexture(meshName, tt);
@ -142,6 +142,8 @@ namespace ZL
renderer.shaderManager.AddShaderFromFiles("planetLand", "resources/shaders/planet_land.vertex", "resources/shaders/planet_land_web.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("spark", "resources/shaders/spark.vertex", "resources/shaders/spark_web.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("skinning", "resources/shaders/skinning.vertex", "resources/shaders/default_web.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("fog", "resources/shaders/fog.vertex", "resources/shaders/fog_web.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("fog_skinning", "resources/shaders/fog_skinning.vertex", "resources/shaders/fog_web.fragment", CONST_ZIP_FILE);
#else
renderer.shaderManager.AddShaderFromFiles("env_sky", "resources/shaders/env_sky.vertex", "resources/shaders/env_sky_desktop.fragment", CONST_ZIP_FILE);
@ -151,14 +153,43 @@ namespace ZL
renderer.shaderManager.AddShaderFromFiles("planetLand", "resources/shaders/planet_land.vertex", "resources/shaders/planet_land_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("spark", "resources/shaders/spark.vertex", "resources/shaders/spark_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("skinning", "resources/shaders/skinning.vertex", "resources/shaders/default_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("fog", "resources/shaders/fog.vertex", "resources/shaders/fog_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("fog_skinning", "resources/shaders/fog_skinning.vertex", "resources/shaders/fog_desktop.fragment", CONST_ZIP_FILE);
#endif
std::cout << "Load resurces step 4" << std::endl;
currentLocation = std::make_unique<Location>(renderer, inventory);
LocationSetup params1;
params1.roomMeshPath = "resources/w/room001.txt";
params1.roomTexturePath = "resources/w/room005.png";
params1.gameObjectsJsonPath = "resources/config2/gameobjects.json";
params1.npcsJsonPath = "resources/config2/npcs.json";
params1.dialoguesJsonPath = "resources/dialogue/sample_dialogues.json";
params1.navigationJsonPath = "resources/config2/navigation.json";
params1.scriptPath = "resources/start.lua";
params1.playerPosition = Eigen::Vector3f::Zero();
params1.ghostPosition = Eigen::Vector3f(0.f, 0.f, -20.f);
location1 = std::make_shared<Location>(renderer, inventory);
location1->setup(params1);
LocationSetup params2 = params1;
params2.roomMeshPath = "resources/w/exterior/Segmented_Plane002.txt";
params2.roomTexturePath = "resources/w/exterior/Segmented_Plane002.png";
params2.gameObjectsJsonPath = "resources/config2/gameobjects2.json";
params2.navigationJsonPath = "resources/config2/navigation2.json";
params2.scriptPath = "resources/start2.lua";
params2.playerPosition = Eigen::Vector3f(7.f, 0.f, 27.f);
params2.npcsJsonPath = "resources/config2/npcs2.json";
params2.ghostPosition = Eigen::Vector3f(700.f, 0.f, 700.f);
location2 = std::make_shared<Location>(renderer, inventory);
location2->setup(params2);
currentLocation = location1;
currentLocation->setup();
std::cout << "Load resurces step 5" << std::endl;
std::cout << "Load resurces step 12" << std::endl;
@ -169,14 +200,17 @@ namespace ZL
renderer.shaderManager.AddShaderFromFiles("shadow_depth_skinning", "resources/shaders/shadow_depth_skinning.vertex", "resources/shaders/shadow_depth_web.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("default_shadow", "resources/shaders/default_shadow.vertex", "resources/shaders/default_shadow_web.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("skinning_shadow", "resources/shaders/skinning_shadow.vertex", "resources/shaders/default_shadow_web.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("fog_shadow", "resources/shaders/fog_shadow.vertex", "resources/shaders/fog_shadow_web.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("fog_skinning_shadow", "resources/shaders/fog_skinning_shadow.vertex", "resources/shaders/fog_shadow_web.fragment", CONST_ZIP_FILE);
#else
renderer.shaderManager.AddShaderFromFiles("shadow_depth", "resources/shaders/shadow_depth.vertex", "resources/shaders/shadow_depth_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("shadow_depth_skinning", "resources/shaders/shadow_depth_skinning.vertex", "resources/shaders/shadow_depth_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("default_shadow", "resources/shaders/default_shadow.vertex", "resources/shaders/default_shadow_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("skinning_shadow", "resources/shaders/skinning_shadow.vertex", "resources/shaders/default_shadow_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("fog_shadow", "resources/shaders/fog_shadow.vertex", "resources/shaders/fog_shadow_desktop.fragment", CONST_ZIP_FILE);
renderer.shaderManager.AddShaderFromFiles("fog_skinning_shadow", "resources/shaders/fog_skinning_shadow.vertex", "resources/shaders/fog_shadow_desktop.fragment", CONST_ZIP_FILE);
#endif
std::cout << "Load resurces step 13" << std::endl;
// Load UI with inventory button
@ -470,16 +504,18 @@ namespace ZL
break;
case SDLK_o:
y = y + 0.002;
//y = y + 0.002;
currentLocation->player->hp = 5;
break;
case SDLK_k:
y = y - 0.002;
//y = y - 0.002;
std::cout << "Player pos: " << currentLocation->player->position.transpose() << std::endl;
break;
case SDLK_p:
x = x + 0.002;
currentLocation = (currentLocation == location1) ? location2 : location1;
std::cout << "Switched to location " << ((currentLocation == location1) ? "1" : "2") << std::endl;
break;
case SDLK_l:

View File

@ -44,6 +44,8 @@ namespace ZL {
VertexRenderStruct loadingMesh;
bool loadingCompleted = false;
std::shared_ptr<Location> location1;
std::shared_ptr<Location> location2;
std::shared_ptr<Location> currentLocation;
Inventory inventory;

View File

@ -30,18 +30,18 @@ namespace ZL
}
void Location::setup()
void Location::setup(const LocationSetup& params)
{
roomTexture = std::make_unique<Texture>(CreateTextureDataFromPng("resources/w/room005.png", CONST_ZIP_FILE));
roomMesh.data = LoadFromTextFile02("resources/w/room001.txt", CONST_ZIP_FILE);
roomTexture = std::make_unique<Texture>(CreateTextureDataFromPng(params.roomTexturePath, CONST_ZIP_FILE));
roomMesh.data = LoadFromTextFile02(params.roomMeshPath, CONST_ZIP_FILE);
roomMesh.data.RotateByMatrix(Eigen::Quaternionf(Eigen::AngleAxisf(-M_PI * 0.5, Eigen::Vector3f::UnitY())).toRotationMatrix());
roomMesh.RefreshVBO();
// Load static game objects
gameObjects = GameObjectLoader::loadAndCreateGameObjects("resources/config2/gameobjects.json", renderer, CONST_ZIP_FILE);
gameObjects = GameObjectLoader::loadAndCreateGameObjects(params.gameObjectsJsonPath, renderer, CONST_ZIP_FILE);
// Load interactive objects
interactiveObjects = GameObjectLoader::loadAndCreateInteractiveObjects("resources/config2/gameobjects.json", renderer, CONST_ZIP_FILE);
interactiveObjects = GameObjectLoader::loadAndCreateInteractiveObjects(params.gameObjectsJsonPath, renderer, CONST_ZIP_FILE);
//auto playerTexture = std::make_shared<Texture>(CreateTextureDataFromPng("resources/w/gg/IMG_20260413_182354_992.png", CONST_ZIP_FILE));
@ -98,11 +98,13 @@ namespace ZL
player->canAttack = true;
player->isPlayer = true;
player->position = params.playerPosition;
player->setTarget(params.playerPosition);
player->setupHitSparks(sparkTexture);
std::cout << "Load resurces step 9" << std::endl;
// Load NPCs from JSON
npcs = GameObjectLoader::loadAndCreate_Npcs("resources/config2/npcs.json", CONST_ZIP_FILE);
npcs = GameObjectLoader::loadAndCreate_Npcs(params.npcsJsonPath, CONST_ZIP_FILE);
for (auto& npc : npcs) {
if (npc) npc->setupHitSparks(sparkTexture);
}
@ -131,7 +133,7 @@ namespace ZL
//npc02->modelScale = 0.1f;
npc02->modelCorrectionRotation = Eigen::Quaternionf(Eigen::AngleAxisf(M_PI, Eigen::Vector3f::UnitY()));
npc02->position = Eigen::Vector3f(0.f, 0.f, -20.f);
npc02->position = params.ghostPosition;
npc02->setTarget(npc02->position);
npc02->canAttack = true;
npc02->attackTarget = player.get();
@ -145,12 +147,12 @@ namespace ZL
std::cout << "Shadow map initialized" << std::endl;
setupNavigation();
setupNavigation(params.navigationJsonPath);
scriptEngine.init(this, &inventory);
scriptEngine.init(this, &inventory, params.scriptPath);
dialogueSystem.init(renderer, CONST_ZIP_FILE);
dialogueSystem.loadDatabase("resources/dialogue/sample_dialogues.json");
dialogueSystem.loadDatabase(params.dialoguesJsonPath);
npcNameText = std::make_unique<TextRenderer>();
if (!npcNameText->init(renderer, "resources/fonts/DroidSans.ttf", 24, CONST_ZIP_FILE)) {
@ -169,7 +171,7 @@ namespace ZL
}
void Location::setupNavigation()
void Location::setupNavigation(const std::string& navigationJsonPath)
{
std::vector<PathFinder::ObstacleMesh> obstacles;
obstacles.reserve(gameObjects.size() + interactiveObjects.size());
@ -186,7 +188,7 @@ namespace ZL
obstacles.push_back({ &intObj.mesh.data, intObj.position });
}
navigation.build(obstacles, "resources/config2/navigation.json", CONST_ZIP_FILE);
navigation.build(obstacles, navigationJsonPath, CONST_ZIP_FILE);
#ifdef SHOW_PATH
buildDebugNavMeshes();
@ -361,12 +363,14 @@ namespace ZL
void Location::drawGame()
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClearColor(0.53, 0.81, 0.92, 1.0f);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
renderer.shaderManager.PushShader(defaultShaderName);
renderer.shaderManager.PushShader("fog");
renderer.RenderUniform1i(textureUniformName, 0);
const float playerEyePos[3] = { 0.0f, 0.0f, -Environment::zoom };
renderer.RenderUniform3fv("uPlayerEyePos", playerEyePos);
renderer.PushPerspectiveProjectionMatrix(1.0 / 1.5,
static_cast<float>(Environment::width) / static_cast<float>(Environment::height),
@ -500,7 +504,7 @@ namespace ZL
void Location::drawGameWithShadows()
{
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClearColor(0.53, 0.81, 0.92, 1.0f);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
#ifdef DEBUG_LIGHT
@ -517,11 +521,13 @@ namespace ZL
renderer.PushSpecialMatrix(shadowMap->getLightViewMatrix());
#else
static const std::string shadowShaderName = "default_shadow";
static const std::string shadowShaderName = "fog_shadow";
renderer.shaderManager.PushShader(shadowShaderName);
renderer.RenderUniform1i(textureUniformName, 0);
renderer.RenderUniform1i("uShadowMap", 1);
const float playerEyePos[3] = { 0.0f, 0.0f, -Environment::zoom };
renderer.RenderUniform3fv("uPlayerEyePos", playerEyePos);
// Bind shadow map texture to unit 1
glActiveTexture(GL_TEXTURE1);

View File

@ -14,6 +14,19 @@
namespace ZL
{
struct LocationSetup
{
std::string roomMeshPath;
std::string roomTexturePath;
std::string gameObjectsJsonPath;
std::string npcsJsonPath;
std::string dialoguesJsonPath;
std::string navigationJsonPath;
std::string scriptPath;
Eigen::Vector3f playerPosition = Eigen::Vector3f::Zero();
Eigen::Vector3f ghostPosition = Eigen::Vector3f::Zero();
};
class Location
{
public:
@ -63,8 +76,8 @@ namespace ZL
int lastMouseY = 0;
void setup();
void setupNavigation();
void setup(const LocationSetup& params);
void setupNavigation(const std::string& navigationJsonPath);
InteractiveObject* raycastInteractiveObjects(const Eigen::Vector3f& rayOrigin, const Eigen::Vector3f& rayDir);
Character* raycastNpcs(const Eigen::Vector3f& rayOrigin, const Eigen::Vector3f& rayDir, float maxDistance = 100.0f);

View File

@ -16,7 +16,7 @@ namespace ZL {
ScriptEngine::ScriptEngine() = default;
ScriptEngine::~ScriptEngine() = default;
void ScriptEngine::init(Location* game, Inventory* inventory) {
void ScriptEngine::init(Location* game, Inventory* inventory, const std::string& scriptPath) {
impl = std::make_unique<Impl>();
sol::state& lua = impl->lua;
@ -165,7 +165,7 @@ namespace ZL {
<< npc->giftItem.name << std::endl;
});
lua.script_file("resources/start.lua");
lua.script_file(scriptPath);
}
void ScriptEngine::callNpcInteractCallback(int npcIndex) {

View File

@ -13,7 +13,7 @@ public:
~ScriptEngine();
// Must be called once, after the Game's NPCs are ready.
void init(Location* game, Inventory* inventory);
void init(Location* game, Inventory* inventory, const std::string& scriptPath);
// Execute a Lua script file. Logs errors to stderr.
void runScript(const std::string& path);

View File

@ -9,8 +9,8 @@
#include "../Character.h"
namespace ZL {
void set_Texture(Character& npc, TextureDataStruct& texture);
void set_Texture(Character& npc, const std::string& meshName, TextureDataStruct& texture);
void set_Texture(Character& npc, const TextureDataStruct& texture);
void set_Texture(Character& npc, const std::string& meshName, const TextureDataStruct& texture);
using json = nlohmann::json;

View File

@ -866,12 +866,10 @@ namespace ZL {
auto shader = shaderManager.GetCurrentShader();
if (shader->attribList.find(attribName) != shader->attribList.end())
glVertexAttribPointer(shader->attribList[attribName], 2, GL_FLOAT, GL_FALSE, stride, pointer);
}
void Renderer::VertexAttribPointer3fv(const std::string& attribName, int stride, const char* pointer)
{
auto shader = shaderManager.GetCurrentShader();
if (shader->attribList.find(attribName) != shader->attribList.end())
glVertexAttribPointer(shader->attribList[attribName], 3, GL_FLOAT, GL_FALSE, stride, pointer);