Welcome to mirror list, hosted at ThFree Co, Russian Federation.

terrain.h « Graphics « Source - github.com/WolfireGames/overgrowth.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: f919c622f765264947ea67930b4c2274b0adfe42 (plain)
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);
};