1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
//-----------------------------------------------------------------------------
// Name: terrain.h
// Developer: Wolfire Games LLC
// Description:
// License: Read below
//-----------------------------------------------------------------------------
//
//
// Copyright 2022 Wolfire Games LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//-----------------------------------------------------------------------------
#pragma once
#include <Graphics/model.h>
#include <Graphics/textures.h>
#include <Graphics/heightmap.h>
#include <Graphics/textureref.h>
#include <Graphics/detailobjectsurface.h>
#include <Math/vec2.h>
#include <Math/vec3.h>
#include <Math/vec4.h>
#include <Asset/Asset/material.h>
#include <Asset/Asset/averagecolorasset.h>
#include <Compat/filepath.h>
#include <Internal/levelxml.h>
class Sky;
class LoadingText;
class SceneGraph;
class Terrain {
private:
HeightmapImage heightmap_;
const char* shader;
bool minimal;
int model_id;
void CalculateHighResVertices(Model &terrain_high_detail_model);
void CalculateHighResFaces(Model &terrain_high_detail_model);
void CalcWorkingPoints(vec3 cam_pos);
void CalculateSimplifiedTerrain();
void CalculateMinimalTerrain();
bool LoadCachedSimplifiedTerrain();
public:
std::list<Model> terrain_patches;
std::list<Model> edge_terrain_patches;
std::list<DetailObjectSurface*> detail_object_surfaces;
std::set<AverageColorRef> average_colors;
void GLInit(Sky* sky);
TextureAssetRef normal_map_ref;
TextureAssetRef color_texture_ref;
TextureAssetRef weight_perturb_ref;
TextureRef baked_texture_ref;
TextureAssetRef baked_texture_asset;
TextureRef detail_texture_ref; // array texture
TextureRef detail_normal_texture_ref; // array texture
std::vector<vec4> detail_texture_color;
std::vector<vec4> detail_texture_color_srgb;
TextureAssetRef detail_texture_weights;
TextureAssetRef detail_texture_tint;
ImageSamplerRef weight_bitmap;
ImageSamplerRef color_bitmap;
std::string color_path;
std::vector<DetailMapInfo> detail_maps_info;
std::vector<DetailObjectLayer> detail_object_layers;
std::string level_name;
std::string weight_map_path;
int terrain_texture_size;
GLuint framebuffer;
void BakeTerrainTexture(GLuint framebuffer, const TextureRef& light_cube);
Model& GetModel() const;
void drawLayer(int which);
void Load(const char* name, const std::string& model_override = NULL);
void LoadMinimal(const char* name, const std::string& model_override = NULL);
void GetShaderNames(std::map<std::string, int>& preload_shaders);
int lineCheck(const vec3& start, const vec3& end, vec3* point, vec3 *normal=0);
~Terrain();
Terrain();
const MaterialRef GetMaterialAtPoint(vec3 point, int *tri = NULL);
void CalcDetailTextures();
void CalculatePatches();
void Dispose();
void HandleMaterialEvent( const std::string &the_event, const vec3 &event_pos, int* tri );
vec4 SampleWeightMapAtPoint( vec3 point, int* tri = NULL );
vec2 GetUVAtPoint(const vec3 &point, int* tri = NULL) const;
vec3 SampleColorMapAtPoint( vec3 point, int *tri );
void SetDetailObjectLayers( const std::vector<DetailObjectLayer> &detail_object_layers );
void SetDetailTextures( const std::vector<DetailMapInfo> &detail_maps_info );
void SetColorTexture(const char* path);
void SetWeightTexture(const char* path);
};
|