13693 lines
424 KiB
C#
13693 lines
424 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.Reflection;
|
|
using System.Text.RegularExpressions;
|
|
using Boo.Lang.Runtime;
|
|
using UnityEngine;
|
|
using UnityScript.Lang;
|
|
|
|
[Serializable]
|
|
public class terraincomposer_save : MonoBehaviour
|
|
{
|
|
public int colormap_resolution;
|
|
|
|
public GameObject Combine_Children;
|
|
|
|
public string software_version;
|
|
|
|
public float software_id;
|
|
|
|
public string filename;
|
|
|
|
public Texture2D tex1;
|
|
|
|
public int create_pass;
|
|
|
|
public string[] heightmap_resolution_list;
|
|
|
|
public string[] splatmap_resolution_list;
|
|
|
|
public string[] detailmap_resolution_list;
|
|
|
|
public string[] detail_resolution_per_patch_list;
|
|
|
|
public string[] image_import_max_settings;
|
|
|
|
public TreeInstance[] trees;
|
|
|
|
public int tree_number;
|
|
|
|
public List<subfilter_class> subfilter;
|
|
|
|
public List<filter_class> filter;
|
|
|
|
public List<precolor_range_class> precolor_range;
|
|
|
|
[NonSerialized]
|
|
public terraincomposer_save script;
|
|
|
|
public int show_prelayer;
|
|
|
|
public List<prelayer_class> prelayers;
|
|
|
|
public prelayer_class prelayer;
|
|
|
|
public List<int> prelayer_stack;
|
|
|
|
public List<Rect> area_stack;
|
|
|
|
public bool area_stack_enabled;
|
|
|
|
public bool area_skip;
|
|
|
|
public List<GenerateArea_Class> areaStack;
|
|
|
|
public int count_area;
|
|
|
|
public bool layer_count;
|
|
|
|
public bool placed_count;
|
|
|
|
public bool overlap;
|
|
|
|
public int layer_heightmap;
|
|
|
|
public int layer_color;
|
|
|
|
public int layer_splat;
|
|
|
|
public int layer_tree;
|
|
|
|
public int layer_grass;
|
|
|
|
public int layer_object;
|
|
|
|
public bool layer_heightmap_foldout;
|
|
|
|
public bool layer_color_foldout;
|
|
|
|
public bool layer_splat_foldout;
|
|
|
|
public bool layer_tree_foldout;
|
|
|
|
public bool layer_grass_foldout;
|
|
|
|
public bool layer_object_foldout;
|
|
|
|
public layer_class current_layer;
|
|
|
|
public filter_class current_filter;
|
|
|
|
public subfilter_class current_subfilter;
|
|
|
|
public string terrain_text;
|
|
|
|
public terrain_class masterTerrain;
|
|
|
|
public List<terrain_class> terrains;
|
|
|
|
public string raw_path;
|
|
|
|
public string raw_save_path;
|
|
|
|
public bool terrains_foldout;
|
|
|
|
public bool terrainSearch;
|
|
|
|
public Transform terrainSearchParent;
|
|
|
|
public Rect terrainMenuRect;
|
|
|
|
public bool terrains_active;
|
|
|
|
public bool terrains_foldout2;
|
|
|
|
public remarks_class remarks;
|
|
|
|
public remarks_class mesh_remarks;
|
|
|
|
public int terrain_instances;
|
|
|
|
public Vector2 terrainInstances;
|
|
|
|
public bool terrain_asset_erase;
|
|
|
|
public int terrain_tiles;
|
|
|
|
public Vector2 terrainTiles;
|
|
|
|
public bool terrainTileLink;
|
|
|
|
public string terrain_path;
|
|
|
|
public Transform terrain_parent;
|
|
|
|
public string terrain_scene_name;
|
|
|
|
public string terrain_asset_name;
|
|
|
|
public float object_resolution;
|
|
|
|
public Transform object_search;
|
|
|
|
public List<mesh_class> meshes;
|
|
|
|
public int meshes_layer;
|
|
|
|
public bool meshes_active;
|
|
|
|
public bool meshes_foldout;
|
|
|
|
public bool meshes_foldout2;
|
|
|
|
public float meshes_heightscale;
|
|
|
|
public area_class meshes_area;
|
|
|
|
public string mesh_text;
|
|
|
|
public mesh_measure_class mesh_measure;
|
|
|
|
public string terrain_slice_path;
|
|
|
|
public Transform terrain_slice_parent;
|
|
|
|
public bool swap_color_range_select;
|
|
|
|
public int swap_color_range_number;
|
|
|
|
public precolor_range_class swap_precolor_range;
|
|
|
|
public bool copy_color_range_select;
|
|
|
|
public bool swap_tree_select;
|
|
|
|
public tree_class swap_tree1;
|
|
|
|
public tree_output_class swap_tree_output;
|
|
|
|
public int swap_tree_position;
|
|
|
|
public bool copy_tree_select;
|
|
|
|
public tree_class copy_tree1;
|
|
|
|
public bool swap_object_select;
|
|
|
|
public object_output_class swap_object_output;
|
|
|
|
public int swap_object_number;
|
|
|
|
public bool copy_object_select;
|
|
|
|
public bool swap_description_select;
|
|
|
|
public int swap_description_prelayer_index;
|
|
|
|
public int swap_description_position;
|
|
|
|
public bool copy_description_select;
|
|
|
|
public int copy_description_prelayer_index;
|
|
|
|
public int copy_description_position;
|
|
|
|
public bool swap_layer_select;
|
|
|
|
public int swap_prelayer_index;
|
|
|
|
public int swap_layer_index;
|
|
|
|
public bool copy_layer_select;
|
|
|
|
public int copy_prelayer_index;
|
|
|
|
public int copy_layer_index;
|
|
|
|
public bool swap_filter_select;
|
|
|
|
public bool copy_filter_select;
|
|
|
|
public bool swap_subfilter_select;
|
|
|
|
public presubfilter_class swap_presubfilter;
|
|
|
|
public int swap_subfilter_index;
|
|
|
|
public bool copy_subfilter_select;
|
|
|
|
public subfilter_class copy_subfilter1;
|
|
|
|
public terrain_class preterrain;
|
|
|
|
public mesh_class premesh;
|
|
|
|
public float mix;
|
|
|
|
public float xx;
|
|
|
|
public float zz;
|
|
|
|
public float resolution;
|
|
|
|
public int splat_plus;
|
|
|
|
public float Rad2Deg;
|
|
|
|
public detail_class[] grass_detail;
|
|
|
|
public SplatPrototype splat1;
|
|
|
|
public int count_value;
|
|
|
|
public int count_color_range;
|
|
|
|
public int count_prelayer;
|
|
|
|
public int count_layer;
|
|
|
|
public int count_tree;
|
|
|
|
public int count_object;
|
|
|
|
public int count_filter;
|
|
|
|
public int count_subfilter;
|
|
|
|
public int call_from;
|
|
|
|
public float random_range;
|
|
|
|
public float random_range2;
|
|
|
|
public Color color1;
|
|
|
|
public Color color2;
|
|
|
|
public float color_r;
|
|
|
|
public float color_g;
|
|
|
|
public float color_b;
|
|
|
|
public float color_a;
|
|
|
|
public bool heightmap_output;
|
|
|
|
public bool heightmap_output_layer;
|
|
|
|
public bool color_output;
|
|
|
|
public bool splat_output;
|
|
|
|
public bool tree_output;
|
|
|
|
public bool grass_output;
|
|
|
|
public bool object_output;
|
|
|
|
public bool world_output;
|
|
|
|
public bool line_output;
|
|
|
|
public bool button1;
|
|
|
|
public bool button_export;
|
|
|
|
public string button_generate_text;
|
|
|
|
public Texture2D export_texture;
|
|
|
|
public byte[] export_bytes;
|
|
|
|
public string export_file;
|
|
|
|
public string export_path;
|
|
|
|
public string export_name;
|
|
|
|
public bool export_color_advanced;
|
|
|
|
public Color export_color;
|
|
|
|
public bool export_color_curve_advanced;
|
|
|
|
public AnimationCurve export_color_curve;
|
|
|
|
public AnimationCurve export_color_curve_red;
|
|
|
|
public AnimationCurve export_color_curve_green;
|
|
|
|
public AnimationCurve export_color_curve_blue;
|
|
|
|
public int seed;
|
|
|
|
public bool generate;
|
|
|
|
public bool generateDone;
|
|
|
|
public bool generate_manual;
|
|
|
|
public int generate_speed;
|
|
|
|
public bool generate_speed_display;
|
|
|
|
public bool generate_sub_break;
|
|
|
|
public bool generate_pause;
|
|
|
|
public float generate_call_time;
|
|
|
|
public float generate_call_time2;
|
|
|
|
public float generate_call_delay;
|
|
|
|
public float generate_time;
|
|
|
|
public float generate_time_start;
|
|
|
|
public bool generate_on_top;
|
|
|
|
public bool generate_world_mode;
|
|
|
|
public bool generate_auto;
|
|
|
|
public int generate_auto_mode;
|
|
|
|
public float generate_auto_delay1;
|
|
|
|
public float generate_auto_delay2;
|
|
|
|
public bool generate_call;
|
|
|
|
public bool generate_error;
|
|
|
|
public int generate_export;
|
|
|
|
public float[,] heights;
|
|
|
|
public float[,,] alphamap;
|
|
|
|
public List<TreeInstance> tree_instances;
|
|
|
|
public int grass_resolution_old;
|
|
|
|
public Color color;
|
|
|
|
public int object_speed;
|
|
|
|
public bool runtime;
|
|
|
|
public bool auto_speed;
|
|
|
|
public float auto_speed_time;
|
|
|
|
public float auto_speed_object_time;
|
|
|
|
public int min_speed;
|
|
|
|
public float frames;
|
|
|
|
public float object_frames;
|
|
|
|
public int target_frame;
|
|
|
|
public bool only_heightmap;
|
|
|
|
public int terrain_index_old;
|
|
|
|
public Color tree_color;
|
|
|
|
public float layer_x;
|
|
|
|
public float layer_y;
|
|
|
|
public bool unload_textures;
|
|
|
|
public bool clean_memory;
|
|
|
|
public float splat_total;
|
|
|
|
public List<distance_class> objects_placed;
|
|
|
|
public distance_class object_info;
|
|
|
|
public int heightmap_x;
|
|
|
|
public int heightmap_y;
|
|
|
|
public int heightmap_x_old;
|
|
|
|
public int heightmap_y_old;
|
|
|
|
public int detailmap_x;
|
|
|
|
public int detailmap_y;
|
|
|
|
public int h_local_x;
|
|
|
|
public int h_local_y;
|
|
|
|
public int map_x;
|
|
|
|
public int map_y;
|
|
|
|
public bool measure_normal;
|
|
|
|
public bool place;
|
|
|
|
public Vector3 position;
|
|
|
|
public Vector3 scale;
|
|
|
|
public float height;
|
|
|
|
public float height_interpolated;
|
|
|
|
public float degree;
|
|
|
|
public Vector3 normal;
|
|
|
|
public float local_x_rot;
|
|
|
|
public float local_y_rot;
|
|
|
|
public float local_x;
|
|
|
|
public float local_y;
|
|
|
|
public float a;
|
|
|
|
public float b;
|
|
|
|
public System.Random random;
|
|
|
|
public bool measure_tool;
|
|
|
|
public bool measure_tool_foldout;
|
|
|
|
public bool measure_tool_active;
|
|
|
|
public bool measure_tool_undock;
|
|
|
|
public bool measure_tool_clicked;
|
|
|
|
public float measure_tool_range;
|
|
|
|
public bool measure_tool_inrange;
|
|
|
|
public Vector2 measure_tool_terrain_point;
|
|
|
|
public Vector2 measure_tool_terrain_point_interpolated;
|
|
|
|
public bool measure_tool_converter_foldout;
|
|
|
|
public float measure_tool_converter_height_input;
|
|
|
|
public float measure_tool_converter_height;
|
|
|
|
public float measure_tool_converter_angle_input;
|
|
|
|
public float measure_tool_converter_angle;
|
|
|
|
public bool stitch_tool;
|
|
|
|
public bool stitch_tool_foldout;
|
|
|
|
public float stitch_tool_border_influence;
|
|
|
|
public AnimationCurve stitch_tool_curve;
|
|
|
|
public float stitch_tool_strength;
|
|
|
|
public bool stitch_command;
|
|
|
|
public bool smooth_tool;
|
|
|
|
public bool smooth_tool_foldout;
|
|
|
|
public float smooth_tool_strength;
|
|
|
|
public int smooth_tool_repeat;
|
|
|
|
public bool smooth_tool_advanced;
|
|
|
|
public float smooth_tool_layer_strength;
|
|
|
|
public bool smooth_command;
|
|
|
|
public string[] smooth_tool_terrain;
|
|
|
|
public int smooth_tool_terrain_select;
|
|
|
|
public animation_curve_class smooth_tool_height_curve;
|
|
|
|
public animation_curve_class smooth_tool_angle_curve;
|
|
|
|
public bool quick_tools;
|
|
|
|
public bool quick_tools_foldout;
|
|
|
|
public bool slice_tool;
|
|
|
|
public bool slice_tool_active;
|
|
|
|
public bool slice_tool_foldout;
|
|
|
|
public bool slice_tool_heightmap_foldout;
|
|
|
|
public bool slice_tool_all_foldout;
|
|
|
|
public Rect slice_tool_rect;
|
|
|
|
public Terrain slice_tool_terrain;
|
|
|
|
public bool slice_tool_erase_terrain_scene;
|
|
|
|
public bool slice_tool_erase_terrain_data;
|
|
|
|
public Vector2 slice_tool_offset;
|
|
|
|
public float slice_tool_min_height;
|
|
|
|
public bool sphere_draw;
|
|
|
|
public float sphere_radius;
|
|
|
|
public Vector3 measure_tool_point_old;
|
|
|
|
public bool image_tools;
|
|
|
|
public texture_tool_class texture_tool;
|
|
|
|
public pattern_tool_class pattern_tool;
|
|
|
|
public heightmap_tool_class heightmap_tool;
|
|
|
|
public bool description_display;
|
|
|
|
public float description_space;
|
|
|
|
public animation_curve_class curve_in_memory_old;
|
|
|
|
public bool meshcapture_tool;
|
|
|
|
public bool meshcapture_tool_foldout;
|
|
|
|
public GameObject meshcapture_tool_object;
|
|
|
|
public Texture2D meshcapture_tool_image;
|
|
|
|
public Transform meshcapture_tool_pivot;
|
|
|
|
public int meshcapture_tool_image_width;
|
|
|
|
public int meshcapture_tool_image_height;
|
|
|
|
public float meshcapture_tool_scale;
|
|
|
|
public bool meshcapture_tool_save_scale;
|
|
|
|
public bool meshcapture_tool_shadows;
|
|
|
|
public Color meshcapture_tool_color;
|
|
|
|
public Color meshcapture_background_color;
|
|
|
|
public int row_object_count;
|
|
|
|
public bool break_x;
|
|
|
|
public float break_time;
|
|
|
|
public float break_time_set;
|
|
|
|
public bool generate_settings;
|
|
|
|
public bool generate_settings_foldout;
|
|
|
|
public int tile_resolution;
|
|
|
|
public int trees_maximum;
|
|
|
|
public terraincomposer_save script_base;
|
|
|
|
public save_trees tree_script;
|
|
|
|
public save_grass grass_script;
|
|
|
|
public int tc_id;
|
|
|
|
public settings_class settings;
|
|
|
|
public RaycastHit hit;
|
|
|
|
public int layerHit;
|
|
|
|
public GameObject TerrainComposer_Parent;
|
|
|
|
[HideInInspector]
|
|
public float filter_value;
|
|
|
|
[HideInInspector]
|
|
public float filter_strength;
|
|
|
|
[HideInInspector]
|
|
public float filter_input;
|
|
|
|
[HideInInspector]
|
|
public float filter_combine;
|
|
|
|
[HideInInspector]
|
|
public float filter_combine_start;
|
|
|
|
[HideInInspector]
|
|
public float subfilter_value;
|
|
|
|
[HideInInspector]
|
|
public int byte_hi2;
|
|
|
|
[HideInInspector]
|
|
public int byte_hi;
|
|
|
|
[HideInInspector]
|
|
public int byte_lo;
|
|
|
|
public List<raw_file_class> raw_files;
|
|
|
|
public bool converted_resolutions;
|
|
|
|
public float converted_version;
|
|
|
|
public GameObject RTP_LODmanager1;
|
|
|
|
public Component rtpLod_script;
|
|
|
|
public List<object_point_class> pointsRange;
|
|
|
|
public List<GameObject> placedObjects;
|
|
|
|
public Vector2 imagePosition;
|
|
|
|
public terraincomposer_save()
|
|
{
|
|
colormap_resolution = 2048;
|
|
software_version = "Beta";
|
|
create_pass = -1;
|
|
heightmap_resolution_list = new string[8] { "4097", "2049", "1025", "513", "257", "129", "65", "33" };
|
|
splatmap_resolution_list = new string[8] { "2048", "1024", "512", "256", "128", "64", "32", "16" };
|
|
detailmap_resolution_list = new string[9] { "2048", "1024", "512", "256", "128", "64", "32", "16", "8" };
|
|
detail_resolution_per_patch_list = new string[5] { "8", "16", "32", "64", "128" };
|
|
image_import_max_settings = new string[8] { "32", "64", "128", "256", "512", "1024", "2048", "4096" };
|
|
subfilter = new List<subfilter_class>();
|
|
filter = new List<filter_class>();
|
|
precolor_range = new List<precolor_range_class>();
|
|
prelayers = new List<prelayer_class>();
|
|
prelayer_stack = new List<int>();
|
|
area_stack = new List<Rect>();
|
|
areaStack = new List<GenerateArea_Class>();
|
|
layer_count = true;
|
|
placed_count = true;
|
|
terrain_text = "Terrain:";
|
|
terrains = new List<terrain_class>();
|
|
raw_path = string.Empty;
|
|
raw_save_path = string.Empty;
|
|
terrains_foldout = true;
|
|
terrains_active = true;
|
|
terrains_foldout2 = true;
|
|
remarks = new remarks_class();
|
|
mesh_remarks = new remarks_class();
|
|
terrain_instances = 1;
|
|
terrain_tiles = 1;
|
|
terrainTileLink = true;
|
|
terrain_scene_name = "Terrain";
|
|
terrain_asset_name = "New Terrain";
|
|
object_resolution = 10f;
|
|
meshes = new List<mesh_class>();
|
|
meshes_active = true;
|
|
meshes_foldout = true;
|
|
meshes_foldout2 = true;
|
|
meshes_area = new area_class();
|
|
mesh_text = "Meshes";
|
|
mesh_measure = new mesh_measure_class();
|
|
resolution = 2048f;
|
|
splat_plus = 1;
|
|
Rad2Deg = 57.29578f;
|
|
splat1 = new SplatPrototype();
|
|
heightmap_output = true;
|
|
color_output = true;
|
|
splat_output = true;
|
|
tree_output = true;
|
|
grass_output = true;
|
|
object_output = true;
|
|
button_generate_text = "Generate";
|
|
export_file = string.Empty;
|
|
export_color_advanced = true;
|
|
export_color = Color.white;
|
|
export_color_curve = AnimationCurve.Linear(0f, 0f, 1f, 1f);
|
|
export_color_curve_red = AnimationCurve.Linear(0f, 0f, 1f, 1f);
|
|
export_color_curve_green = AnimationCurve.Linear(0f, 0f, 1f, 1f);
|
|
export_color_curve_blue = AnimationCurve.Linear(0f, 0f, 1f, 1f);
|
|
seed = 10;
|
|
generate_speed = 10;
|
|
generate_on_top = true;
|
|
generate_auto_mode = 1;
|
|
generate_auto_delay2 = 0.2f;
|
|
tree_instances = new List<TreeInstance>();
|
|
object_speed = 3;
|
|
min_speed = 3;
|
|
target_frame = 60;
|
|
terrain_index_old = -1;
|
|
unload_textures = true;
|
|
clean_memory = true;
|
|
objects_placed = new List<distance_class>();
|
|
object_info = new distance_class();
|
|
place = true;
|
|
random = new System.Random();
|
|
measure_tool_foldout = true;
|
|
measure_tool_range = 10000f;
|
|
stitch_tool = true;
|
|
stitch_tool_foldout = true;
|
|
stitch_tool_border_influence = 20f;
|
|
stitch_tool_curve = AnimationCurve.Linear(0f, 0f, 1f, 1f);
|
|
stitch_tool_strength = 1f;
|
|
smooth_tool = true;
|
|
smooth_tool_foldout = true;
|
|
smooth_tool_strength = 1f;
|
|
smooth_tool_repeat = 1;
|
|
smooth_tool_layer_strength = 1f;
|
|
smooth_tool_height_curve = new animation_curve_class();
|
|
smooth_tool_angle_curve = new animation_curve_class();
|
|
quick_tools = true;
|
|
slice_tool = true;
|
|
slice_tool_foldout = true;
|
|
slice_tool_erase_terrain_scene = true;
|
|
slice_tool_offset = default(Vector2);
|
|
sphere_draw = true;
|
|
sphere_radius = 10f;
|
|
texture_tool = new texture_tool_class();
|
|
pattern_tool = new pattern_tool_class();
|
|
heightmap_tool = new heightmap_tool_class();
|
|
description_display = true;
|
|
description_space = 15f;
|
|
meshcapture_tool = true;
|
|
meshcapture_tool_foldout = true;
|
|
meshcapture_tool_image_width = 128;
|
|
meshcapture_tool_image_height = 128;
|
|
meshcapture_tool_scale = 1f;
|
|
meshcapture_tool_save_scale = true;
|
|
meshcapture_tool_color = Color.white;
|
|
meshcapture_background_color = Color.black;
|
|
break_time = 0.2f;
|
|
generate_settings_foldout = true;
|
|
tile_resolution = 1000;
|
|
trees_maximum = 1000;
|
|
settings = new settings_class();
|
|
raw_files = new List<raw_file_class>();
|
|
pointsRange = new List<object_point_class>();
|
|
placedObjects = new List<GameObject>();
|
|
}
|
|
|
|
public virtual heightmap_type_enum GetHeightmapEnum(condition_type_enum input)
|
|
{
|
|
int result;
|
|
switch (input)
|
|
{
|
|
case condition_type_enum.Image:
|
|
result = 0;
|
|
break;
|
|
case condition_type_enum.Random:
|
|
result = 1;
|
|
break;
|
|
case condition_type_enum.RandomRange:
|
|
result = 2;
|
|
break;
|
|
case condition_type_enum.Current:
|
|
result = 4;
|
|
break;
|
|
case condition_type_enum.RawHeightmap:
|
|
result = 5;
|
|
break;
|
|
case condition_type_enum.RayCast:
|
|
result = 6;
|
|
break;
|
|
default:
|
|
result = 3;
|
|
break;
|
|
}
|
|
return (heightmap_type_enum)result;
|
|
}
|
|
|
|
public virtual condition_type_enum GetCondtionTypeEnum(heightmap_type_enum input)
|
|
{
|
|
int result;
|
|
switch (input)
|
|
{
|
|
case heightmap_type_enum.Image:
|
|
result = 3;
|
|
break;
|
|
case heightmap_type_enum.Random:
|
|
result = 4;
|
|
break;
|
|
case heightmap_type_enum.RandomRange:
|
|
result = 5;
|
|
break;
|
|
case heightmap_type_enum.Current:
|
|
result = 7;
|
|
break;
|
|
case heightmap_type_enum.RawHeightmap:
|
|
result = 9;
|
|
break;
|
|
case heightmap_type_enum.RayCast:
|
|
result = 11;
|
|
break;
|
|
default:
|
|
result = 6;
|
|
break;
|
|
}
|
|
return (condition_type_enum)result;
|
|
}
|
|
|
|
public virtual void add_prelayer(bool search_level)
|
|
{
|
|
prelayers.Add(new prelayer_class(0, prelayers.Count));
|
|
prelayers[prelayers.Count - 1].index = prelayers.Count - 1;
|
|
prelayers[prelayers.Count - 1].prearea.area_max = settings.area_max;
|
|
prelayers[prelayers.Count - 1].prearea.max();
|
|
prelayers[prelayers.Count - 1].set_prelayer_text();
|
|
if (search_level)
|
|
{
|
|
search_level_prelayer(0, prelayers.Count - 1, 0);
|
|
}
|
|
}
|
|
|
|
public virtual void erase_prelayer(int prelayer_index)
|
|
{
|
|
erase_layers(prelayers[prelayer_index]);
|
|
if (prelayer_index < prelayers.Count - 1)
|
|
{
|
|
swap_prelayer1(prelayer_index, prelayers.Count - 1);
|
|
}
|
|
prelayers.RemoveAt(prelayers.Count - 1);
|
|
if (prelayer_index < prelayers.Count)
|
|
{
|
|
search_prelayer(prelayer_index);
|
|
prelayers[prelayer_index].index = prelayer_index;
|
|
prelayers[prelayer_index].set_prelayer_text();
|
|
}
|
|
}
|
|
|
|
public virtual void search_prelayer(int prelayer_index)
|
|
{
|
|
for (int i = 0; i < prelayers.Count; i++)
|
|
{
|
|
for (int j = 0; j < prelayers[i].layer.Count; j++)
|
|
{
|
|
for (int k = 0; k < prelayers[i].layer[j].object_output.@object.Count; k++)
|
|
{
|
|
if (prelayers[i].layer[j].object_output.@object[k].prelayer_index == prelayers.Count)
|
|
{
|
|
prelayers[i].layer[j].object_output.@object[k].prelayer_index = prelayer_index;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void search_level_prelayer(int prelayer_index, int find_index, int level)
|
|
{
|
|
for (int i = 0; i < prelayers[prelayer_index].layer.Count; i++)
|
|
{
|
|
for (int j = 0; j < prelayers[prelayer_index].layer[i].object_output.@object.Count; j++)
|
|
{
|
|
if (prelayers[prelayer_index].layer[i].object_output.@object[j].prelayer_created)
|
|
{
|
|
level++;
|
|
if (prelayers[prelayer_index].layer[i].object_output.@object[j].prelayer_index == find_index)
|
|
{
|
|
prelayers[prelayers[prelayer_index].layer[i].object_output.@object[j].prelayer_index].level = level;
|
|
return;
|
|
}
|
|
search_level_prelayer(prelayers[prelayer_index].layer[i].object_output.@object[j].prelayer_index, find_index, level);
|
|
level--;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void swap_prelayer1(int prelayer_index1, int prelayer_index2)
|
|
{
|
|
prelayer_class prelayer_class2 = prelayers[prelayer_index1];
|
|
prelayers[prelayer_index1] = prelayers[prelayer_index2];
|
|
prelayers[prelayer_index2] = prelayers[prelayer_index1];
|
|
}
|
|
|
|
public virtual void new_layergroup(prelayer_class prelayer1, int description_number)
|
|
{
|
|
int count = prelayer1.predescription.description[description_number].layer_index.Count;
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
erase_layer(prelayer1, prelayer1.predescription.description[description_number].layer_index[0], description_number, 0, true, true, false);
|
|
}
|
|
}
|
|
|
|
public virtual void erase_description(prelayer_class prelayer1, int description_number)
|
|
{
|
|
if (prelayer1.predescription.description.Count > 1)
|
|
{
|
|
int count = prelayer1.predescription.description[description_number].layer_index.Count;
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
erase_layer(prelayer1, prelayer1.predescription.description[description_number].layer_index[0], description_number, 0, true, true, false);
|
|
}
|
|
prelayer1.predescription.erase_description(description_number);
|
|
}
|
|
count_layers();
|
|
}
|
|
|
|
public virtual void swap_description(int description_number1, int description_number2, prelayer_class prelayer1)
|
|
{
|
|
if (description_number2 >= 0 && description_number2 <= prelayer1.predescription.description.Count - 1)
|
|
{
|
|
int count = prelayer1.predescription.description[description_number1].layer_index.Count;
|
|
int count2 = prelayer1.predescription.description[description_number2].layer_index.Count;
|
|
int num = default(int);
|
|
string text = prelayer1.predescription.description[description_number1].text;
|
|
bool edit = prelayer1.predescription.description[description_number1].edit;
|
|
prelayer1.predescription.description[description_number1].text = prelayer1.predescription.description[description_number2].text;
|
|
prelayer1.predescription.description[description_number2].text = text;
|
|
prelayer1.predescription.description[description_number1].edit = prelayer1.predescription.description[description_number2].edit;
|
|
prelayer1.predescription.description[description_number2].edit = edit;
|
|
bool foldout = prelayer1.predescription.description[description_number1].foldout;
|
|
prelayer1.predescription.description[description_number1].foldout = prelayer1.predescription.description[description_number2].foldout;
|
|
prelayer1.predescription.description[description_number2].foldout = foldout;
|
|
for (num = 0; num < count; num++)
|
|
{
|
|
replace_layer(0, description_number1, description_number2, prelayer1);
|
|
}
|
|
for (num = 0; num < count2; num++)
|
|
{
|
|
replace_layer(0, description_number2, description_number1, prelayer1);
|
|
}
|
|
prelayer1.predescription.set_description_enum();
|
|
}
|
|
}
|
|
|
|
public virtual void replace_layer(int source_layer_index, int source_description_number, int target_description_number, prelayer_class prelayer1)
|
|
{
|
|
int num = get_layer_position(prelayer1.predescription.description[target_description_number].layer_index.Count, target_description_number, prelayer1);
|
|
add_layer(prelayer1, num, layer_output_enum.color, target_description_number, prelayer1.predescription.description[target_description_number].layer_index.Count, false, false, true);
|
|
prelayer1.layer[num] = copy_layer(prelayer1.layer[prelayer1.predescription.description[source_description_number].layer_index[source_layer_index]], true, true);
|
|
erase_layer(prelayer1, prelayer1.predescription.description[source_description_number].layer_index[source_layer_index], source_description_number, source_layer_index, true, true, true);
|
|
}
|
|
|
|
public virtual void count_layers()
|
|
{
|
|
if (!layer_count)
|
|
{
|
|
return;
|
|
}
|
|
layer_heightmap = (layer_color = (layer_splat = (layer_tree = (layer_grass = (layer_object = 0)))));
|
|
for (int i = 0; i < prelayers.Count; i++)
|
|
{
|
|
for (int j = 0; j < prelayers[i].layer.Count; j++)
|
|
{
|
|
switch (prelayers[i].layer[j].output)
|
|
{
|
|
case layer_output_enum.heightmap:
|
|
layer_heightmap++;
|
|
break;
|
|
case layer_output_enum.color:
|
|
layer_color++;
|
|
break;
|
|
case layer_output_enum.splat:
|
|
layer_splat++;
|
|
break;
|
|
case layer_output_enum.tree:
|
|
layer_tree++;
|
|
break;
|
|
case layer_output_enum.grass:
|
|
layer_grass++;
|
|
break;
|
|
case layer_output_enum.@object:
|
|
layer_object++;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void erase_layers(prelayer_class prelayer1)
|
|
{
|
|
int count = prelayer1.layer.Count;
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
erase_layer(prelayer1, 0, 0, 0, false, true, false);
|
|
}
|
|
}
|
|
|
|
public virtual void erase_layer(prelayer_class prelayer1, int layer_number, int description_number, int layer_index, bool description, bool loop_layer, bool count_layer)
|
|
{
|
|
if (prelayer1.layer.Count > 0)
|
|
{
|
|
if (loop_layer)
|
|
{
|
|
this.loop_layer(prelayer1.layer[layer_number], -1);
|
|
}
|
|
erase_filters(prelayer1.layer[layer_number].prefilter);
|
|
for (int i = 0; i < prelayer1.layer[layer_number].tree_output.tree.Count; i++)
|
|
{
|
|
erase_filters(prelayer1.layer[layer_number].tree_output.tree[i].prefilter);
|
|
}
|
|
prelayer1.layer.RemoveAt(layer_number);
|
|
}
|
|
if (description)
|
|
{
|
|
prelayer1.predescription.erase_layer_index(layer_number, layer_index, description_number);
|
|
}
|
|
if (count_layer)
|
|
{
|
|
count_layers();
|
|
}
|
|
prelayer1.set_prelayer_text();
|
|
}
|
|
|
|
public virtual void strip_layer(prelayer_class prelayer1, int layer_number)
|
|
{
|
|
for (int i = 0; i < prelayer1.layer[layer_number].object_output.@object.Count; i++)
|
|
{
|
|
if (prelayer1.layer[layer_number].object_output.@object[i].prelayer_created)
|
|
{
|
|
erase_prelayer(prelayer1.layer[layer_number].object_output.@object[i].prelayer_index);
|
|
}
|
|
}
|
|
erase_filters(prelayer1.layer[layer_number].prefilter);
|
|
}
|
|
|
|
public virtual void add_layer(prelayer_class prelayer1, int layer_number, layer_output_enum layer_output, int description_number, int layer_index, bool new_filter, bool count_layer, bool custom)
|
|
{
|
|
prelayer1.layer.Insert(layer_number, new layer_class());
|
|
if (new_filter)
|
|
{
|
|
add_filter(0, prelayer1.layer[layer_number].prefilter);
|
|
}
|
|
prelayer1.layer[layer_number].output = layer_output;
|
|
prelayer1.predescription.add_layer_index(layer_number, layer_index, description_number);
|
|
if (count_layer)
|
|
{
|
|
count_layers();
|
|
}
|
|
prelayer1.set_prelayer_text();
|
|
if (layer_output == layer_output_enum.heightmap && custom && new_filter)
|
|
{
|
|
filter[filter.Count - 1].type = condition_type_enum.Always;
|
|
}
|
|
}
|
|
|
|
public virtual void swap_layer(prelayer_class prelayer1, int layer_number1, prelayer_class prelayer2, int layer_number2, bool blink)
|
|
{
|
|
if (layer_number2 < 0 || layer_number2 > prelayer2.layer.Count - 1)
|
|
{
|
|
return;
|
|
}
|
|
layer_class value = prelayer1.layer[layer_number1];
|
|
prelayer1.layer[layer_number1] = prelayer2.layer[layer_number2];
|
|
prelayer2.layer[layer_number2] = value;
|
|
if (blink)
|
|
{
|
|
if (!(prelayer1.layer[layer_number1].color_layer[0] >= 1.5f))
|
|
{
|
|
prelayer1.layer[layer_number1].color_layer = prelayer1.layer[layer_number1].color_layer + new Color(1f, 1f, 1f, 1f);
|
|
}
|
|
if (!(prelayer2.layer[layer_number2].color_layer[0] >= 1.5f))
|
|
{
|
|
prelayer2.layer[layer_number2].color_layer = prelayer2.layer[layer_number2].color_layer + new Color(1f, 1f, 1f, 1f);
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual int get_layer_position(int layer_index, int description_number, prelayer_class prelayer1)
|
|
{
|
|
int num = 0;
|
|
int num2 = 0;
|
|
int result;
|
|
while (true)
|
|
{
|
|
if (num2 < prelayer1.predescription.description.Count)
|
|
{
|
|
if (num2 == description_number)
|
|
{
|
|
result = num + layer_index;
|
|
break;
|
|
}
|
|
num += prelayer1.predescription.description[num2].layer_index.Count;
|
|
num2++;
|
|
continue;
|
|
}
|
|
result = -1;
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual int get_layer_description(prelayer_class prelayer1, int layer_index)
|
|
{
|
|
int num = 0;
|
|
int result;
|
|
while (true)
|
|
{
|
|
if (num < prelayer1.predescription.description.Count)
|
|
{
|
|
int num2 = 0;
|
|
while (num2 < prelayer1.predescription.description[num].layer_index.Count)
|
|
{
|
|
if (prelayer1.predescription.description[num].layer_index[num2] != layer_index)
|
|
{
|
|
num2++;
|
|
continue;
|
|
}
|
|
goto IL_0030;
|
|
}
|
|
num++;
|
|
continue;
|
|
}
|
|
result = -1;
|
|
break;
|
|
IL_0030:
|
|
result = num;
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual void layer_sort(prelayer_class prelayer, int description_number)
|
|
{
|
|
int num = default(int);
|
|
bool flag = false;
|
|
bool flag2 = false;
|
|
bool flag3 = false;
|
|
bool flag4 = false;
|
|
bool flag5 = false;
|
|
bool flag6 = false;
|
|
int index = default(int);
|
|
int index2 = default(int);
|
|
int index3 = default(int);
|
|
int index4 = default(int);
|
|
int index5 = default(int);
|
|
int index6 = default(int);
|
|
for (int i = 0; i < prelayer.predescription.description[description_number].layer_index.Count; i++)
|
|
{
|
|
flag = false;
|
|
flag2 = false;
|
|
flag3 = false;
|
|
flag4 = false;
|
|
flag5 = false;
|
|
flag6 = false;
|
|
for (int j = i; j < prelayer.predescription.description[description_number].layer_index.Count; j++)
|
|
{
|
|
if (!flag && prelayer.layer[prelayer.predescription.description[description_number].layer_index[j]].output == layer_output_enum.heightmap)
|
|
{
|
|
index = j;
|
|
flag = true;
|
|
}
|
|
if (!flag2 && prelayer.layer[prelayer.predescription.description[description_number].layer_index[j]].output == layer_output_enum.color)
|
|
{
|
|
index2 = j;
|
|
flag2 = true;
|
|
}
|
|
if (!flag3 && prelayer.layer[prelayer.predescription.description[description_number].layer_index[j]].output == layer_output_enum.splat)
|
|
{
|
|
index3 = j;
|
|
flag3 = true;
|
|
}
|
|
if (!flag4 && prelayer.layer[prelayer.predescription.description[description_number].layer_index[j]].output == layer_output_enum.tree)
|
|
{
|
|
index4 = j;
|
|
flag4 = true;
|
|
}
|
|
if (!flag5 && prelayer.layer[prelayer.predescription.description[description_number].layer_index[j]].output == layer_output_enum.grass)
|
|
{
|
|
index5 = j;
|
|
flag5 = true;
|
|
}
|
|
if (!flag6 && prelayer.layer[prelayer.predescription.description[description_number].layer_index[j]].output == layer_output_enum.@object)
|
|
{
|
|
index6 = j;
|
|
flag6 = true;
|
|
}
|
|
}
|
|
if (flag)
|
|
{
|
|
swap_layer(prelayer, prelayer.predescription.description[description_number].layer_index[i], prelayer, prelayer.predescription.description[description_number].layer_index[index], false);
|
|
}
|
|
else if (flag2)
|
|
{
|
|
swap_layer(prelayer, prelayer.predescription.description[description_number].layer_index[i], prelayer, prelayer.predescription.description[description_number].layer_index[index2], false);
|
|
}
|
|
else if (flag3)
|
|
{
|
|
swap_layer(prelayer, prelayer.predescription.description[description_number].layer_index[i], prelayer, prelayer.predescription.description[description_number].layer_index[index3], false);
|
|
}
|
|
else if (flag4)
|
|
{
|
|
swap_layer(prelayer, prelayer.predescription.description[description_number].layer_index[i], prelayer, prelayer.predescription.description[description_number].layer_index[index4], false);
|
|
}
|
|
else if (flag5)
|
|
{
|
|
swap_layer(prelayer, prelayer.predescription.description[description_number].layer_index[i], prelayer, prelayer.predescription.description[description_number].layer_index[index5], false);
|
|
}
|
|
else if (flag6)
|
|
{
|
|
swap_layer(prelayer, prelayer.predescription.description[description_number].layer_index[i], prelayer, prelayer.predescription.description[description_number].layer_index[index6], false);
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void LayerSort(prelayer_class prelayer, int layerGroupIndex)
|
|
{
|
|
description_class description_class2 = prelayer.predescription.description[layerGroupIndex];
|
|
layer_class layer_class2 = null;
|
|
layer_class layer_class3 = null;
|
|
int num = -1;
|
|
int num2 = default(int);
|
|
int num3 = default(int);
|
|
for (int i = 1; i < description_class2.layer_index.Count; i++)
|
|
{
|
|
layer_class2 = prelayer.layer[description_class2.layer_index[i]];
|
|
layer_class3 = prelayer.layer[description_class2.layer_index[i - 1]];
|
|
num2 = (int)layer_class2.output;
|
|
num3 = (int)layer_class3.output;
|
|
if (num2 < num3)
|
|
{
|
|
swap_layer(prelayer, prelayer.predescription.description[layerGroupIndex].layer_index[i], prelayer, prelayer.predescription.description[layerGroupIndex].layer_index[i - 1], false);
|
|
if (num == -1)
|
|
{
|
|
num = i;
|
|
}
|
|
if (i > 1)
|
|
{
|
|
i -= 2;
|
|
continue;
|
|
}
|
|
i = num;
|
|
num = -1;
|
|
}
|
|
else if (num != -1)
|
|
{
|
|
i = num;
|
|
num = -1;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void layers_sort(prelayer_class prelayer)
|
|
{
|
|
for (int i = 0; i < prelayer.predescription.description.Count; i++)
|
|
{
|
|
LayerSort(prelayer, i);
|
|
}
|
|
}
|
|
|
|
public virtual void erase_filters(prefilter_class prefilter)
|
|
{
|
|
int count = prefilter.filter_index.Count;
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
erase_filter(0, prefilter);
|
|
}
|
|
}
|
|
|
|
public virtual void add_filter(int filter_number, prefilter_class prefilter)
|
|
{
|
|
filter.Add(new filter_class());
|
|
prefilter.filter_index.Insert(filter_number, filter.Count - 1);
|
|
if (terrains.Count > 1)
|
|
{
|
|
filter[filter.Count - 1].preimage.image_mode = image_mode_enum.MultiTerrain;
|
|
}
|
|
prefilter.set_filter_text();
|
|
}
|
|
|
|
public virtual void add_animation_curve(List<animation_curve_class> precurve_list, int curve_number, bool copy)
|
|
{
|
|
if (!copy)
|
|
{
|
|
precurve_list.Insert(curve_number, new animation_curve_class());
|
|
precurve_list[curve_number].curve = AnimationCurve.Linear(0f, 0f, 1f, 0f);
|
|
precurve_list[curve_number].default_curve = new AnimationCurve(precurve_list[curve_number].curve.keys);
|
|
}
|
|
else
|
|
{
|
|
precurve_list.Insert(curve_number, copy_animation_curve(precurve_list[curve_number - 1]));
|
|
}
|
|
}
|
|
|
|
public virtual void erase_animation_curve(List<animation_curve_class> precurve_list, int curve_number)
|
|
{
|
|
if (precurve_list.Count > 0)
|
|
{
|
|
precurve_list.RemoveAt(curve_number);
|
|
}
|
|
}
|
|
|
|
public virtual void swap_animation_curve(List<animation_curve_class> curve_list, int curve_number1, int curve_number2)
|
|
{
|
|
animation_curve_class value = curve_list[curve_number1];
|
|
curve_list[curve_number1] = curve_list[curve_number2];
|
|
curve_list[curve_number2] = value;
|
|
}
|
|
|
|
public virtual void erase_filter(int filter_number, prefilter_class prefilter)
|
|
{
|
|
if (prefilter.filter_index.Count > 0)
|
|
{
|
|
erase_subfilters(filter[prefilter.filter_index[filter_number]]);
|
|
int num = prefilter.filter_index[filter_number];
|
|
swap_filter2(num, filter.Count - 1, false);
|
|
filter.RemoveAt(filter.Count - 1);
|
|
prefilter.filter_index.RemoveAt(filter_number);
|
|
relink_filter_index(num);
|
|
prefilter.set_filter_text();
|
|
}
|
|
}
|
|
|
|
public virtual void erase_filter_reference(prefilter_class prefilter, int filter_index)
|
|
{
|
|
prefilter.filter_index.RemoveAt(filter_index);
|
|
prefilter.set_filter_text();
|
|
}
|
|
|
|
public virtual void erase_filter_unlinked(int filter_number)
|
|
{
|
|
swap_filter2(filter_number, filter.Count - 1, false);
|
|
filter.RemoveAt(filter.Count - 1);
|
|
relink_filter_index(filter_number);
|
|
}
|
|
|
|
public virtual void swap_filter(prefilter_class prefilter1, int filter_index1, prefilter_class prefilter2, int filter_index2)
|
|
{
|
|
if (filter_index2 >= 0 && filter_index2 <= prefilter2.filter_index.Count - 1)
|
|
{
|
|
filter_class value = filter[prefilter1.filter_index[filter_index1]];
|
|
filter[prefilter1.filter_index[filter_index1]] = filter[prefilter2.filter_index[filter_index2]];
|
|
filter[prefilter2.filter_index[filter_index2]] = value;
|
|
if (!(filter[prefilter1.filter_index[filter_index1]].color_filter[0] >= 1.5f))
|
|
{
|
|
filter[prefilter1.filter_index[filter_index1]].color_filter = filter[prefilter1.filter_index[filter_index1]].color_filter + new Color(1f, 1f, 1f, 1f);
|
|
}
|
|
if (!(filter[prefilter2.filter_index[filter_index2]].color_filter[0] >= 1.5f))
|
|
{
|
|
filter[prefilter2.filter_index[filter_index2]].color_filter = filter[prefilter2.filter_index[filter_index2]].color_filter + new Color(1f, 1f, 1f, 1f);
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void swap_filter2(int filter_number1, int filter_number2, bool blink)
|
|
{
|
|
filter_class value = filter[filter_number1];
|
|
filter[filter_number1] = filter[filter_number2];
|
|
filter[filter_number2] = value;
|
|
if (blink)
|
|
{
|
|
if (!(filter[filter_number1].color_filter[0] >= 1.5f))
|
|
{
|
|
filter[filter_number1].color_filter = filter[filter_number1].color_filter + new Color(1f, 1f, 1f, 1f);
|
|
}
|
|
if (!(filter[filter_number2].color_filter[0] >= 1.5f))
|
|
{
|
|
filter[filter_number2].color_filter = filter[filter_number2].color_filter + new Color(1f, 1f, 1f, 1f);
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void swap_object(object_output_class object_output1, int object_number1, object_output_class object_output2, int object_number2)
|
|
{
|
|
object_class value = object_output1.@object[object_number1];
|
|
float value2 = object_output1.object_value.value[object_number1];
|
|
bool value3 = object_output1.object_value.active[object_number1];
|
|
object_output1.@object[object_number1] = object_output2.@object[object_number2];
|
|
object_output2.@object[object_number2] = value;
|
|
if (!(object_output1.@object[object_number1].color_object[0] <= 0.5f))
|
|
{
|
|
object_output1.@object[object_number1].color_object = object_output1.@object[object_number1].color_object + new Color(-0.5f, 0f, -0.5f, 0f);
|
|
}
|
|
if (!(object_output2.@object[object_number2].color_object[0] <= 0.5f))
|
|
{
|
|
object_output2.@object[object_number2].color_object = object_output2.@object[object_number2].color_object + new Color(-0.5f, 0f, -0.5f, 0f);
|
|
}
|
|
object_output1.object_value.value[object_number1] = object_output2.object_value.value[object_number2];
|
|
object_output2.object_value.value[object_number2] = value2;
|
|
object_output1.object_value.active[object_number1] = object_output2.object_value.active[object_number2];
|
|
object_output2.object_value.active[object_number2] = value3;
|
|
object_output1.object_value.calc_value();
|
|
if (!RuntimeServices.EqualityOperator(object_output1, object_output2))
|
|
{
|
|
object_output2.object_value.calc_value();
|
|
}
|
|
}
|
|
|
|
public virtual void swap_tree(tree_output_class tree_output1, int tree_number1, tree_output_class tree_output2, int tree_number2)
|
|
{
|
|
tree_class value = tree_output1.tree[tree_number1];
|
|
float value2 = tree_output1.tree_value.value[tree_number1];
|
|
bool value3 = tree_output1.tree_value.active[tree_number1];
|
|
tree_output1.tree[tree_number1] = tree_output2.tree[tree_number2];
|
|
tree_output2.tree[tree_number2] = value;
|
|
if (!(tree_output1.tree[tree_number1].color_tree[0] >= 1.5f))
|
|
{
|
|
tree_output1.tree[tree_number1].color_tree = tree_output1.tree[tree_number1].color_tree + new Color(0.5f, 0.5f, 0.5f, 0f);
|
|
}
|
|
if (!(tree_output2.tree[tree_number2].color_tree[0] >= 1.5f))
|
|
{
|
|
tree_output2.tree[tree_number2].color_tree = tree_output2.tree[tree_number2].color_tree + new Color(0.5f, 0.5f, 0.5f, 0f);
|
|
}
|
|
tree_output1.tree_value.value[tree_number1] = tree_output2.tree_value.value[tree_number2];
|
|
tree_output2.tree_value.value[tree_number2] = value2;
|
|
tree_output1.tree_value.active[tree_number1] = tree_output2.tree_value.active[tree_number2];
|
|
tree_output2.tree_value.active[tree_number2] = value3;
|
|
tree_output1.tree_value.calc_value();
|
|
if (!RuntimeServices.EqualityOperator(tree_output1, tree_output2))
|
|
{
|
|
tree_output2.tree_value.calc_value();
|
|
}
|
|
}
|
|
|
|
public virtual void add_object(object_output_class object_output, int object_number)
|
|
{
|
|
object_output.@object.Insert(object_number, new object_class());
|
|
object_output.object_value.add_value(object_number, 50f);
|
|
object_output.set_object_text();
|
|
}
|
|
|
|
public virtual void erase_object(object_output_class object_output, int object_number)
|
|
{
|
|
if (object_output.@object.Count > 0)
|
|
{
|
|
if (object_output.@object[object_number].prelayer_created)
|
|
{
|
|
erase_prelayer(object_output.@object[object_number].prelayer_index);
|
|
}
|
|
object_output.@object.RemoveAt(object_number);
|
|
object_output.object_value.erase_value(object_number);
|
|
object_output.set_object_text();
|
|
}
|
|
}
|
|
|
|
public virtual void clear_object(object_output_class object_output)
|
|
{
|
|
int count = object_output.@object.Count;
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
erase_object(object_output, object_output.@object.Count - 1);
|
|
}
|
|
}
|
|
|
|
public virtual void swap_color_range(precolor_range_class precolor_range1, int color_range_number1, precolor_range_class precolor_range2, int color_range_number2)
|
|
{
|
|
color_range_class value = precolor_range1.color_range[color_range_number1];
|
|
float value2 = precolor_range1.color_range_value.value[color_range_number1];
|
|
bool value3 = precolor_range1.color_range_value.active[color_range_number1];
|
|
precolor_range1.color_range[color_range_number1] = precolor_range2.color_range[color_range_number2];
|
|
precolor_range2.color_range[color_range_number2] = value;
|
|
if (!(precolor_range1.color_range[color_range_number1].color_color_range[0] >= 1.5f))
|
|
{
|
|
precolor_range1.color_range[color_range_number1].color_color_range = precolor_range1.color_range[color_range_number1].color_color_range + new Color(1f, 1f, 1f, 1f);
|
|
}
|
|
if (!(precolor_range2.color_range[color_range_number2].color_color_range[0] >= 1.5f))
|
|
{
|
|
precolor_range2.color_range[color_range_number2].color_color_range = precolor_range2.color_range[color_range_number2].color_color_range + new Color(1f, 1f, 1f, 1f);
|
|
}
|
|
precolor_range1.color_range_value.value[color_range_number1] = precolor_range2.color_range_value.value[color_range_number2];
|
|
precolor_range2.color_range_value.value[color_range_number2] = value2;
|
|
precolor_range1.color_range_value.active[color_range_number1] = precolor_range2.color_range_value.active[color_range_number2];
|
|
precolor_range2.color_range_value.active[color_range_number2] = value3;
|
|
precolor_range1.color_range_value.calc_value();
|
|
precolor_range1.set_precolor_range_curve();
|
|
if (!RuntimeServices.EqualityOperator(precolor_range1, precolor_range2))
|
|
{
|
|
precolor_range2.color_range_value.calc_value();
|
|
precolor_range2.set_precolor_range_curve();
|
|
}
|
|
if (precolor_range1.one_color)
|
|
{
|
|
precolor_range1.color_range[color_range_number1].one_color = true;
|
|
}
|
|
if (precolor_range2.one_color)
|
|
{
|
|
precolor_range2.color_range[color_range_number2].one_color = true;
|
|
}
|
|
}
|
|
|
|
public virtual void change_filters_active(prefilter_class prefilter, bool invert)
|
|
{
|
|
for (int i = 0; i < prefilter.filter_index.Count; i++)
|
|
{
|
|
if (!invert)
|
|
{
|
|
filter[prefilter.filter_index[i]].active = prefilter.filters_active;
|
|
}
|
|
else
|
|
{
|
|
filter[prefilter.filter_index[i]].active = !filter[prefilter.filter_index[i]].active;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void change_filters_foldout(prefilter_class prefilter, bool invert)
|
|
{
|
|
for (int i = 0; i < prefilter.filter_index.Count; i++)
|
|
{
|
|
if (!invert)
|
|
{
|
|
filter[prefilter.filter_index[i]].foldout = prefilter.filters_foldout;
|
|
}
|
|
else
|
|
{
|
|
filter[prefilter.filter_index[i]].foldout = !filter[prefilter.filter_index[i]].foldout;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void change_subfilters_active(presubfilter_class presubfilter, bool invert)
|
|
{
|
|
for (int i = 0; i < presubfilter.subfilter_index.Count; i++)
|
|
{
|
|
if (!invert)
|
|
{
|
|
subfilter[presubfilter.subfilter_index[i]].active = presubfilter.subfilters_active;
|
|
}
|
|
else
|
|
{
|
|
subfilter[presubfilter.subfilter_index[i]].active = !subfilter[presubfilter.subfilter_index[i]].active;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void change_subfilters_foldout(presubfilter_class presubfilter, bool invert)
|
|
{
|
|
for (int i = 0; i < presubfilter.subfilter_index.Count; i++)
|
|
{
|
|
if (!invert)
|
|
{
|
|
subfilter[presubfilter.subfilter_index[i]].foldout = presubfilter.subfilters_foldout;
|
|
}
|
|
else
|
|
{
|
|
subfilter[presubfilter.subfilter_index[i]].foldout = !subfilter[presubfilter.subfilter_index[i]].foldout;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void change_terrains_active(bool invert)
|
|
{
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if (!invert)
|
|
{
|
|
terrains[i].active = terrains_active;
|
|
}
|
|
else
|
|
{
|
|
terrains[i].active = !terrains[i].active;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void change_meshes_active(bool invert)
|
|
{
|
|
for (int i = 0; i < meshes.Count; i++)
|
|
{
|
|
if (!invert)
|
|
{
|
|
meshes[i].active = meshes_active;
|
|
}
|
|
else
|
|
{
|
|
meshes[i].active = !meshes[i].active;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void change_terrains_foldout(bool invert)
|
|
{
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if (!invert)
|
|
{
|
|
terrains[i].foldout = terrains_foldout2;
|
|
}
|
|
else
|
|
{
|
|
terrains[i].foldout = !terrains[i].foldout;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void change_meshes_foldout(bool invert)
|
|
{
|
|
for (int i = 0; i < meshes.Count; i++)
|
|
{
|
|
if (!invert)
|
|
{
|
|
meshes[i].foldout = meshes_foldout2;
|
|
}
|
|
else
|
|
{
|
|
meshes[i].foldout = !meshes[i].foldout;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void change_trees_active(tree_output_class tree_output, bool invert)
|
|
{
|
|
for (int i = 0; i < tree_output.tree.Count; i++)
|
|
{
|
|
if (!invert)
|
|
{
|
|
tree_output.tree_value.active[i] = tree_output.trees_active;
|
|
}
|
|
else
|
|
{
|
|
tree_output.tree_value.active[i] = !tree_output.tree_value.active[i];
|
|
}
|
|
}
|
|
tree_output.tree_value.calc_value();
|
|
}
|
|
|
|
public virtual void change_trees_foldout(tree_output_class tree_output, bool invert)
|
|
{
|
|
for (int i = 0; i < tree_output.tree.Count; i++)
|
|
{
|
|
if (!invert)
|
|
{
|
|
tree_output.tree[i].foldout = tree_output.trees_foldout;
|
|
}
|
|
else
|
|
{
|
|
tree_output.tree[i].foldout = !tree_output.tree[i].foldout;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void change_trees_settings_foldout(terrain_class preterrain1, bool invert)
|
|
{
|
|
for (int i = 0; i < preterrain1.treePrototypes.Count; i++)
|
|
{
|
|
if (!invert)
|
|
{
|
|
preterrain1.treePrototypes[i].foldout = preterrain1.trees_foldout;
|
|
}
|
|
else
|
|
{
|
|
preterrain1.treePrototypes[i].foldout = !preterrain1.treePrototypes[i].foldout;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void change_splats_settings_foldout(terrain_class preterrain1, bool invert)
|
|
{
|
|
for (int i = 0; i < preterrain1.splatPrototypes.Count; i++)
|
|
{
|
|
if (!invert)
|
|
{
|
|
preterrain1.splatPrototypes[i].foldout = preterrain1.splats_foldout;
|
|
}
|
|
else
|
|
{
|
|
preterrain1.splatPrototypes[i].foldout = !preterrain1.splatPrototypes[i].foldout;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void change_color_splats_settings_foldout(terrain_class preterrain1, bool invert)
|
|
{
|
|
for (int i = 0; i < settings.color_splatPrototypes.Length; i++)
|
|
{
|
|
if (!invert)
|
|
{
|
|
settings.color_splatPrototypes[i].foldout = preterrain1.splats_foldout;
|
|
}
|
|
else
|
|
{
|
|
settings.color_splatPrototypes[i].foldout = !settings.color_splatPrototypes[i].foldout;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void change_details_settings_foldout(terrain_class preterrain1, bool invert)
|
|
{
|
|
for (int i = 0; i < preterrain1.detailPrototypes.Count; i++)
|
|
{
|
|
if (!invert)
|
|
{
|
|
preterrain1.detailPrototypes[i].foldout = preterrain1.details_foldout;
|
|
}
|
|
else
|
|
{
|
|
preterrain1.detailPrototypes[i].foldout = !preterrain1.detailPrototypes[i].foldout;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void change_objects_active(object_output_class object_output, bool invert)
|
|
{
|
|
for (int i = 0; i < object_output.@object.Count; i++)
|
|
{
|
|
if (!invert)
|
|
{
|
|
object_output.object_value.active[i] = object_output.objects_active;
|
|
}
|
|
else
|
|
{
|
|
object_output.object_value.active[i] = !object_output.object_value.active[i];
|
|
}
|
|
}
|
|
object_output.object_value.calc_value();
|
|
}
|
|
|
|
public virtual void change_objects_foldout(object_output_class object_output, bool invert)
|
|
{
|
|
for (int i = 0; i < object_output.@object.Count; i++)
|
|
{
|
|
if (!invert)
|
|
{
|
|
object_output.@object[i].foldout = object_output.objects_foldout;
|
|
}
|
|
else
|
|
{
|
|
object_output.@object[i].foldout = !object_output.@object[i].foldout;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void change_color_ranges_active(precolor_range_class precolor_range, bool invert)
|
|
{
|
|
for (int i = 0; i < precolor_range.color_range.Count; i++)
|
|
{
|
|
if (!invert)
|
|
{
|
|
precolor_range.color_range_value.active[i] = precolor_range.color_ranges_active;
|
|
}
|
|
else
|
|
{
|
|
precolor_range.color_range_value.active[i] = !precolor_range.color_range_value.active[i];
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void erase_subfilters(filter_class filter)
|
|
{
|
|
int count = filter.presubfilter.subfilter_index.Count;
|
|
int num = default(int);
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
erase_subfilter(0, filter.presubfilter);
|
|
}
|
|
}
|
|
|
|
public virtual void add_subfilter(int subfilter_number, presubfilter_class presubfilter)
|
|
{
|
|
subfilter.Add(new subfilter_class());
|
|
presubfilter.subfilter_index.Insert(subfilter_number, subfilter.Count - 1);
|
|
if (terrains.Count > 1)
|
|
{
|
|
subfilter[subfilter.Count - 1].preimage.image_mode = image_mode_enum.MultiTerrain;
|
|
}
|
|
presubfilter.set_subfilter_text();
|
|
}
|
|
|
|
public virtual void add_line_point(List<line_list_class> line_list, int line_point_number)
|
|
{
|
|
line_list.Insert(line_point_number, new line_list_class());
|
|
}
|
|
|
|
public virtual void erase_line_point(List<line_list_class> line_list, int line_point_number)
|
|
{
|
|
line_list.RemoveAt(line_point_number);
|
|
}
|
|
|
|
public virtual void erase_subfilter(int subfilter_number, presubfilter_class presubfilter)
|
|
{
|
|
if (presubfilter.subfilter_index.Count > 0)
|
|
{
|
|
int num = presubfilter.subfilter_index[subfilter_number];
|
|
swap_subfilter2(num, subfilter.Count - 1, false);
|
|
subfilter.RemoveAt(subfilter.Count - 1);
|
|
presubfilter.subfilter_index.RemoveAt(subfilter_number);
|
|
relink_subfilter_index(num);
|
|
presubfilter.set_subfilter_text();
|
|
}
|
|
}
|
|
|
|
public virtual void erase_subfilter_reference(presubfilter_class presubfilter, int subfilter_index)
|
|
{
|
|
presubfilter.subfilter_index.RemoveAt(subfilter_index);
|
|
presubfilter.set_subfilter_text();
|
|
}
|
|
|
|
public virtual void erase_subfilter_unlinked(int subfilter_number)
|
|
{
|
|
swap_subfilter2(subfilter_number, subfilter.Count - 1, false);
|
|
subfilter.RemoveAt(subfilter.Count - 1);
|
|
relink_subfilter_index(subfilter_number);
|
|
}
|
|
|
|
public virtual void swap_subfilter(presubfilter_class presubfilter1, int subfilter_index1, presubfilter_class presubfilter2, int subfilter_index2)
|
|
{
|
|
if (subfilter_index2 >= 0 && subfilter_index2 <= presubfilter2.subfilter_index.Count - 1)
|
|
{
|
|
subfilter_class value = subfilter[presubfilter1.subfilter_index[subfilter_index1]];
|
|
subfilter[presubfilter1.subfilter_index[subfilter_index1]] = subfilter[presubfilter2.subfilter_index[subfilter_index2]];
|
|
subfilter[presubfilter2.subfilter_index[subfilter_index2]] = value;
|
|
if (!(subfilter[presubfilter1.subfilter_index[subfilter_index1]].color_subfilter[0] >= 1.5f))
|
|
{
|
|
subfilter[presubfilter1.subfilter_index[subfilter_index1]].color_subfilter = subfilter[presubfilter1.subfilter_index[subfilter_index1]].color_subfilter + new Color(1f, 1f, 1f, 1f);
|
|
}
|
|
if (!(subfilter[presubfilter2.subfilter_index[subfilter_index2]].color_subfilter[0] >= 1.5f))
|
|
{
|
|
subfilter[presubfilter2.subfilter_index[subfilter_index2]].color_subfilter = subfilter[presubfilter2.subfilter_index[subfilter_index2]].color_subfilter + new Color(1f, 1f, 1f, 1f);
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void swap_subfilter2(int subfilter_number1, int subfilter_number2, bool blink)
|
|
{
|
|
subfilter_class value = subfilter[subfilter_number1];
|
|
subfilter[subfilter_number1] = subfilter[subfilter_number2];
|
|
subfilter[subfilter_number2] = value;
|
|
if (blink)
|
|
{
|
|
if (!(subfilter[subfilter_number1].color_subfilter[0] >= 1.5f))
|
|
{
|
|
subfilter[subfilter_number1].color_subfilter = subfilter[subfilter_number1].color_subfilter + new Color(1f, 1f, 1f, 1f);
|
|
}
|
|
if (!(subfilter[subfilter_number2].color_subfilter[0] >= 1.5f))
|
|
{
|
|
subfilter[subfilter_number2].color_subfilter = subfilter[subfilter_number2].color_subfilter + new Color(1f, 1f, 1f, 1f);
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void new_layers()
|
|
{
|
|
filter.Clear();
|
|
subfilter.Clear();
|
|
prelayers.Clear();
|
|
reset_swapcopy();
|
|
disable_outputs();
|
|
prelayers.Add(new prelayer_class(0, 0));
|
|
prelayer = prelayers[0];
|
|
prelayer.prearea.active = false;
|
|
filename = string.Empty;
|
|
set_area_resolution(terrains[0], prelayer.prearea);
|
|
settings.colormap = false;
|
|
count_layers();
|
|
}
|
|
|
|
public virtual void reset_swapcopy()
|
|
{
|
|
swap_layer_select = false;
|
|
swap_filter_select = false;
|
|
swap_subfilter_select = false;
|
|
swap_object_select = false;
|
|
swap_color_range_select = false;
|
|
swap_description_select = false;
|
|
copy_layer_select = false;
|
|
copy_filter_select = false;
|
|
copy_subfilter_select = false;
|
|
copy_object_select = false;
|
|
copy_color_range_select = false;
|
|
copy_description_select = false;
|
|
for (int i = 0; i < filter.Count; i++)
|
|
{
|
|
for (int j = 0; j < filter[i].precurve_list.Count; j++)
|
|
{
|
|
filter[i].precurve_list[j].curve_text = "Curve";
|
|
}
|
|
}
|
|
for (int k = 0; k < subfilter.Count; k++)
|
|
{
|
|
for (int j = 0; j < subfilter[k].precurve_list.Count; j++)
|
|
{
|
|
subfilter[k].precurve_list[j].curve_text = "Curve";
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void reset_software_version()
|
|
{
|
|
software_id = 0f;
|
|
for (int i = 0; i < prelayers.Count; i++)
|
|
{
|
|
for (int j = 0; j < prelayers[i].layer.Count; j++)
|
|
{
|
|
prelayers[i].layer[j].software_id = 0f;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual int get_output_length(layer_class layer)
|
|
{
|
|
return (layer.output != layer_output_enum.heightmap) ? ((layer.output != layer_output_enum.color) ? ((layer.output == layer_output_enum.splat) ? layer.splat_output.splat.Count : ((layer.output == layer_output_enum.tree) ? layer.tree_output.tree.Count : ((layer.output == layer_output_enum.grass) ? layer.grass_output.grass.Count : ((layer.output != layer_output_enum.@object) ? (-1) : layer.object_output.@object.Count)))) : 0) : 0;
|
|
}
|
|
|
|
public virtual void set_view_only_selected(prelayer_class prelayer, layer_output_enum selected, bool disable_view)
|
|
{
|
|
if (disable_view)
|
|
{
|
|
prelayer.view_heightmap_layer = (prelayer.view_color_layer = (prelayer.view_splat_layer = (prelayer.view_tree_layer = (prelayer.view_grass_layer = (prelayer.view_object_layer = false)))));
|
|
}
|
|
if (selected == layer_output_enum.heightmap)
|
|
{
|
|
prelayer.view_heightmap_layer = true;
|
|
}
|
|
if (selected == layer_output_enum.color)
|
|
{
|
|
prelayer.view_color_layer = true;
|
|
}
|
|
if (selected == layer_output_enum.splat)
|
|
{
|
|
prelayer.view_splat_layer = true;
|
|
}
|
|
if (selected == layer_output_enum.tree)
|
|
{
|
|
prelayer.view_tree_layer = true;
|
|
}
|
|
if (selected == layer_output_enum.grass)
|
|
{
|
|
prelayer.view_grass_layer = true;
|
|
}
|
|
if (selected == layer_output_enum.@object)
|
|
{
|
|
prelayer.view_object_layer = true;
|
|
}
|
|
}
|
|
|
|
public virtual void set_output(layer_output_enum selected)
|
|
{
|
|
if (selected == layer_output_enum.heightmap)
|
|
{
|
|
disable_outputs();
|
|
heightmap_output = true;
|
|
}
|
|
if (selected == layer_output_enum.color)
|
|
{
|
|
disable_outputs();
|
|
color_output = true;
|
|
}
|
|
if (selected == layer_output_enum.splat)
|
|
{
|
|
disable_outputs();
|
|
splat_output = true;
|
|
}
|
|
if (selected == layer_output_enum.tree)
|
|
{
|
|
disable_outputs();
|
|
tree_output = true;
|
|
}
|
|
if (selected == layer_output_enum.grass)
|
|
{
|
|
disable_outputs();
|
|
grass_output = true;
|
|
}
|
|
if (selected == layer_output_enum.@object)
|
|
{
|
|
disable_outputs();
|
|
object_output = true;
|
|
}
|
|
}
|
|
|
|
public virtual bool swap_search_layer(prelayer_class prelayer1, prelayer_class prelayer2, layer_class layer, string text1, string text2)
|
|
{
|
|
int i;
|
|
if (prelayer2.index > 0)
|
|
{
|
|
for (i = 0; i < prelayer1.layer.Count; i++)
|
|
{
|
|
for (int j = 0; j < prelayer1.layer[i].object_output.@object.Count; j++)
|
|
{
|
|
if (!prelayer1.layer[i].object_output.@object[j].prelayer_created)
|
|
{
|
|
continue;
|
|
}
|
|
int num = 0;
|
|
while (num < prelayers[prelayer1.layer[i].object_output.@object[j].prelayer_index].layer.Count)
|
|
{
|
|
if (RuntimeServices.EqualityOperator(prelayers[prelayer1.layer[i].object_output.@object[j].prelayer_index].layer[num], layer))
|
|
{
|
|
prelayer1.layer[i].swap_text = prelayer1.layer[i].swap_text.Replace(text1, text2);
|
|
}
|
|
if (prelayers[prelayer1.layer[i].object_output.@object[j].prelayer_index].layer.Count <= 0 || !swap_search_layer(prelayers[prelayer1.layer[i].object_output.@object[j].prelayer_index], prelayer2, layer, text1, text2))
|
|
{
|
|
num++;
|
|
continue;
|
|
}
|
|
goto IL_0139;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
int result = 0;
|
|
goto IL_01eb;
|
|
IL_01eb:
|
|
return (byte)result != 0;
|
|
IL_0139:
|
|
prelayer1.layer[i].swap_text = prelayer1.layer[i].swap_text.Replace(text1, text2);
|
|
result = 1;
|
|
goto IL_01eb;
|
|
}
|
|
|
|
public virtual void set_area_cube(int terrain_number)
|
|
{
|
|
terrain_class terrain_class3 = terrains[terrain_number];
|
|
Vector3 localScale = default(Vector3);
|
|
float num = terrain_class3.terrain.terrainData.size.x / resolution;
|
|
float num2 = terrain_class3.terrain.terrainData.size.z / resolution;
|
|
Vector3 vector = terrain_class3.terrain.transform.position;
|
|
localScale.x = (terrain_class3.prearea.area.xMax - terrain_class3.prearea.area.x) * num;
|
|
localScale.z = (terrain_class3.prearea.area.yMax - terrain_class3.prearea.area.y) * num2;
|
|
localScale.y = 50f;
|
|
vector.x += terrain_class3.prearea.area.x * num + localScale.x / 2f;
|
|
vector.z += terrain_class3.prearea.area.y * num2 + localScale.z / 2f;
|
|
vector.y = transform.position.y;
|
|
transform.position = vector;
|
|
transform.localScale = localScale;
|
|
}
|
|
|
|
public virtual void calc_area_max(area_class prearea)
|
|
{
|
|
Rect area_max = new Rect
|
|
{
|
|
width = terrains[0].tiles.x * terrains[0].size.x,
|
|
height = terrains[0].tiles.y * terrains[0].size.z
|
|
};
|
|
int index = default(int);
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if (terrains[i].tile_z == 0f && terrains[i].tile_x == 0f)
|
|
{
|
|
index = i;
|
|
if (!terrains[i].terrain)
|
|
{
|
|
return;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
area_max.x = terrains[index].terrain.transform.position.x;
|
|
area_max.y = terrains[index].terrain.transform.position.z;
|
|
prearea.area_max = area_max;
|
|
prearea.round_area_to_step(prearea.area_max);
|
|
correct_area_max(prearea);
|
|
}
|
|
|
|
public virtual void correct_area_max(area_class prearea)
|
|
{
|
|
if (!(prearea.area.xMin >= prearea.area_max.xMin))
|
|
{
|
|
prearea.area.xMin = prearea.area_max.xMin;
|
|
}
|
|
if (!(prearea.area.xMax <= prearea.area_max.xMax))
|
|
{
|
|
prearea.area.xMax = prearea.area_max.xMax;
|
|
}
|
|
if (!(prearea.area.yMin >= prearea.area_max.yMin))
|
|
{
|
|
prearea.area.yMin = prearea.area_max.yMin;
|
|
}
|
|
if (!(prearea.area.yMax <= prearea.area_max.yMax))
|
|
{
|
|
prearea.area.yMax = prearea.area_max.yMax;
|
|
}
|
|
}
|
|
|
|
public virtual void set_terrain_length(int length_new)
|
|
{
|
|
if (length_new != terrains.Count)
|
|
{
|
|
if (length_new > terrains.Count)
|
|
{
|
|
terrains.Add(new terrain_class());
|
|
if (terrains.Count > 1)
|
|
{
|
|
terrains[terrains.Count - 1].size = terrains[terrains.Count - 2].size;
|
|
terrains[terrains.Count - 1].heightmap_resolution_list = terrains[terrains.Count - 2].heightmap_resolution_list;
|
|
terrains[terrains.Count - 1].splatmap_resolution_list = terrains[terrains.Count - 2].splatmap_resolution_list;
|
|
terrains[terrains.Count - 1].basemap_resolution_list = terrains[terrains.Count - 2].basemap_resolution_list;
|
|
terrains[terrains.Count - 1].detailmap_resolution_list = terrains[terrains.Count - 2].detailmap_resolution_list;
|
|
terrains[terrains.Count - 1].detail_resolution_per_patch_list = terrains[terrains.Count - 2].detail_resolution_per_patch_list;
|
|
set_terrain_resolution_from_list(terrains[terrains.Count - 1]);
|
|
}
|
|
terrains[terrains.Count - 1].prearea.area.xMax = resolution;
|
|
terrains[terrains.Count - 1].prearea.area.yMax = resolution;
|
|
terrains[terrains.Count - 1].index = terrains.Count - 1;
|
|
}
|
|
else
|
|
{
|
|
terrains.RemoveAt(terrains.Count - 1);
|
|
}
|
|
}
|
|
if (terrains.Count == 1)
|
|
{
|
|
terrains[0].tile_x = 0f;
|
|
terrains[0].tile_z = 0f;
|
|
terrains[0].tiles = new Vector2(1f, 1f);
|
|
}
|
|
calc_terrain_one_more_tile();
|
|
set_smooth_tool_terrain_popup();
|
|
set_terrain_text();
|
|
}
|
|
|
|
public virtual void add_terrain(int terrain_number)
|
|
{
|
|
terrains.Insert(terrain_number, new terrain_class());
|
|
terrains[terrains.Count - 1].prearea.area.xMax = resolution;
|
|
terrains[terrains.Count - 1].prearea.area.yMax = resolution;
|
|
terrains[terrains.Count - 1].index = terrain_number;
|
|
set_smooth_tool_terrain_popup();
|
|
set_terrain_text();
|
|
}
|
|
|
|
public virtual void SetTerrainDefault(terrain_class preterrain)
|
|
{
|
|
preterrain.size = new Vector3(1000f, 500f, 1000f);
|
|
}
|
|
|
|
public virtual void clear_terrains()
|
|
{
|
|
terrains.Clear();
|
|
add_terrain(0);
|
|
SetTerrainDefault(terrains[0]);
|
|
}
|
|
|
|
public virtual void clear_meshes()
|
|
{
|
|
meshes.Clear();
|
|
meshes.Add(new mesh_class());
|
|
}
|
|
|
|
public virtual void clear_terrain_list(bool deleteTerrainHierarchy)
|
|
{
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if (deleteTerrainHierarchy)
|
|
{
|
|
DeleteTerrain(terrains[i]);
|
|
}
|
|
if (i > 0)
|
|
{
|
|
terrains.RemoveAt(i);
|
|
i--;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void DeleteTerrain(terrain_class preterrain)
|
|
{
|
|
if (preterrain.terrain != null)
|
|
{
|
|
UnityEngine.Object.Destroy(preterrain.terrain.gameObject);
|
|
}
|
|
}
|
|
|
|
public virtual void set_terrain_text()
|
|
{
|
|
if (terrains.Count > 1)
|
|
{
|
|
terrain_text = "Terrains(" + terrains.Count + ")";
|
|
}
|
|
else
|
|
{
|
|
terrain_text = "Terrain(" + terrains.Count + ")";
|
|
}
|
|
}
|
|
|
|
public virtual bool erase_raw_file(int raw_file_index)
|
|
{
|
|
int result;
|
|
if (raw_file_index < raw_files.Count)
|
|
{
|
|
raw_files[raw_file_index] = raw_files[raw_files.Count - 1];
|
|
raw_files.RemoveAt(raw_files.Count - 1);
|
|
loop_raw_file(raw_file_index, false, true, false);
|
|
result = 1;
|
|
}
|
|
else
|
|
{
|
|
result = 0;
|
|
}
|
|
return (byte)result != 0;
|
|
}
|
|
|
|
public virtual int check_raw_file_in_list(string file)
|
|
{
|
|
int num = 0;
|
|
int result;
|
|
while (true)
|
|
{
|
|
if (num < raw_files.Count)
|
|
{
|
|
if (file.ToLower() == raw_files[num].file.ToLower())
|
|
{
|
|
result = num;
|
|
break;
|
|
}
|
|
num++;
|
|
continue;
|
|
}
|
|
result = -1;
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual void strip_auto_search_file(auto_search_class auto_search)
|
|
{
|
|
string text = new string("0"[0], auto_search.digits);
|
|
string text2 = auto_search.format.Replace("%x", auto_search.start_x.ToString(text));
|
|
text2 = text2.Replace("%y", auto_search.start_y.ToString(text));
|
|
text2 = text2.Replace("%n", auto_search.start_n.ToString(text));
|
|
auto_search.filename = Path.GetFileNameWithoutExtension(auto_search.path_full).Replace(text2, string.Empty);
|
|
auto_search.extension = Path.GetExtension(auto_search.path_full);
|
|
if (auto_search.extension.Length != 0)
|
|
{
|
|
auto_search.filename = auto_search.filename.Replace(auto_search.extension, string.Empty);
|
|
}
|
|
}
|
|
|
|
public virtual void clean_raw_file_list()
|
|
{
|
|
loop_raw_file(0, false, false, true);
|
|
for (int i = 0; i < raw_files.Count; i++)
|
|
{
|
|
if (!raw_files[i].linked)
|
|
{
|
|
erase_raw_file(i);
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual bool loop_raw_file(int raw_file_index, bool check_double, bool relink, bool mark_linked)
|
|
{
|
|
int num = 0;
|
|
int num2 = 0;
|
|
if (mark_linked)
|
|
{
|
|
for (int i = 0; i < raw_files.Count; i++)
|
|
{
|
|
if (!raw_files[i].created)
|
|
{
|
|
raw_files[i].linked = false;
|
|
}
|
|
}
|
|
}
|
|
int num3 = 0;
|
|
int result;
|
|
while (true)
|
|
{
|
|
if (num3 < terrains.Count)
|
|
{
|
|
if (terrains[num3].raw_file_index > -1)
|
|
{
|
|
if (mark_linked)
|
|
{
|
|
raw_files[terrains[num3].raw_file_index].linked = true;
|
|
}
|
|
if (check_double)
|
|
{
|
|
if (terrains[num3].raw_file_index == raw_file_index)
|
|
{
|
|
num++;
|
|
}
|
|
if (num > 1)
|
|
{
|
|
result = 1;
|
|
break;
|
|
}
|
|
}
|
|
if (relink && terrains[num3].raw_file_index == raw_files.Count)
|
|
{
|
|
terrains[num3].raw_file_index = raw_file_index;
|
|
}
|
|
}
|
|
num3++;
|
|
continue;
|
|
}
|
|
int num4 = 0;
|
|
while (true)
|
|
{
|
|
if (num4 < filter.Count)
|
|
{
|
|
if (filter[num4].raw != null)
|
|
{
|
|
for (num2 = 0; num2 < filter[num4].raw.file_index.Count; num2++)
|
|
{
|
|
if (filter[num4].raw.file_index[num2] <= -1)
|
|
{
|
|
continue;
|
|
}
|
|
if (mark_linked)
|
|
{
|
|
raw_files[filter[num4].raw.file_index[num2]].linked = true;
|
|
}
|
|
if (check_double)
|
|
{
|
|
if (filter[num4].raw.file_index[num2] == raw_file_index)
|
|
{
|
|
num++;
|
|
}
|
|
if (num > 1)
|
|
{
|
|
goto IL_01cd;
|
|
}
|
|
}
|
|
if (relink && filter[num4].raw.file_index[num2] == raw_files.Count)
|
|
{
|
|
filter[num4].raw.file_index[num2] = raw_file_index;
|
|
}
|
|
}
|
|
}
|
|
num4++;
|
|
continue;
|
|
}
|
|
int num5 = 0;
|
|
while (true)
|
|
{
|
|
if (num5 < subfilter.Count)
|
|
{
|
|
if (subfilter[num5].raw != null)
|
|
{
|
|
for (num2 = 0; num2 < subfilter[num5].raw.file_index.Count; num2++)
|
|
{
|
|
if (subfilter[num5].raw.file_index[num2] <= -1)
|
|
{
|
|
continue;
|
|
}
|
|
if (mark_linked)
|
|
{
|
|
raw_files[subfilter[num5].raw.file_index[num2]].linked = true;
|
|
}
|
|
if (check_double)
|
|
{
|
|
if (subfilter[num5].raw.file_index[num2] == raw_file_index)
|
|
{
|
|
num++;
|
|
}
|
|
if (num > 1)
|
|
{
|
|
goto IL_0317;
|
|
}
|
|
}
|
|
if (relink && subfilter[num5].raw.file_index[num2] == raw_files.Count)
|
|
{
|
|
subfilter[num5].raw.file_index[num2] = raw_file_index;
|
|
}
|
|
}
|
|
}
|
|
num5++;
|
|
continue;
|
|
}
|
|
result = 0;
|
|
break;
|
|
IL_0317:
|
|
result = 1;
|
|
break;
|
|
}
|
|
break;
|
|
IL_01cd:
|
|
result = 1;
|
|
break;
|
|
}
|
|
break;
|
|
}
|
|
return (byte)result != 0;
|
|
}
|
|
|
|
public virtual void reset_raw_file(int index)
|
|
{
|
|
for (int i = 0; i < filter.Count; i++)
|
|
{
|
|
if (RuntimeServices.EqualityOperator(filter[i].raw, null))
|
|
{
|
|
continue;
|
|
}
|
|
for (int j = 0; j < filter[i].raw.file_index.Count; j++)
|
|
{
|
|
if (filter[i].raw.file_index[j] == index)
|
|
{
|
|
filter[i].raw.file_index[j] = -1;
|
|
}
|
|
}
|
|
}
|
|
for (int i = 0; i < subfilter.Count; i++)
|
|
{
|
|
if (RuntimeServices.EqualityOperator(subfilter[i].raw, null))
|
|
{
|
|
continue;
|
|
}
|
|
for (int j = 0; j < subfilter[i].raw.file_index.Count; j++)
|
|
{
|
|
if (subfilter[i].raw.file_index[j] == index)
|
|
{
|
|
subfilter[i].raw.file_index[j] = -1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void reset_all_outputs()
|
|
{
|
|
terrain_reset_heightmap(terrains[0], true);
|
|
terrain_all_reset_splat();
|
|
terrain_reset_trees(terrains[0], true);
|
|
terrain_reset_grass(terrains[0], true);
|
|
terrain_reset_heightmap(terrains[0], true);
|
|
loop_prelayer("(cpo)", 0, true);
|
|
}
|
|
|
|
public virtual void terrain_reset_heightmap(terrain_class preterrain1, bool all)
|
|
{
|
|
if (!preterrain1.terrain || !preterrain1.terrain.terrainData)
|
|
{
|
|
return;
|
|
}
|
|
float[,] array = (float[,])System.Array.CreateInstance(typeof(float), new int[2]
|
|
{
|
|
preterrain1.terrain.terrainData.heightmapResolution,
|
|
preterrain1.terrain.terrainData.heightmapResolution
|
|
});
|
|
if (!all)
|
|
{
|
|
if ((bool)preterrain1.terrain)
|
|
{
|
|
preterrain1.terrain.terrainData.SetHeights(0, 0, array);
|
|
preterrain1.color_terrain = new Color(0.5f, 0.5f, 1f, 1f);
|
|
}
|
|
return;
|
|
}
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if ((bool)terrains[i].terrain)
|
|
{
|
|
if ((float)terrains[i].terrain.terrainData.heightmapResolution != Mathf.Sqrt(array.Length))
|
|
{
|
|
array = (float[,])System.Array.CreateInstance(typeof(float), new int[2]
|
|
{
|
|
terrains[i].terrain.terrainData.heightmapResolution,
|
|
terrains[i].terrain.terrainData.heightmapResolution
|
|
});
|
|
}
|
|
terrains[i].terrain.terrainData.SetHeights(0, 0, array);
|
|
terrains[i].color_terrain = new Color(0.5f, 0.5f, 1f, 1f);
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void terrain_reset_splat(terrain_class preterrain1)
|
|
{
|
|
if (!preterrain1.terrain || !preterrain1.terrain.terrainData)
|
|
{
|
|
return;
|
|
}
|
|
assign_terrain_splat_alpha(preterrain1);
|
|
if (preterrain1.splat_alpha == null)
|
|
{
|
|
return;
|
|
}
|
|
if (preterrain1.splat_alpha.Length > 0)
|
|
{
|
|
texture_fill(preterrain1.splat_alpha[0], new Color(1f, 0f, 0f, 0f), true);
|
|
}
|
|
if (preterrain1.splat_alpha.Length > 1)
|
|
{
|
|
for (int i = 1; i < preterrain1.splat_alpha.Length; i++)
|
|
{
|
|
texture_fill(preterrain1.splat_alpha[i], new Color(0f, 0f, 0f, 0f), true);
|
|
}
|
|
}
|
|
preterrain1.terrain.terrainData.SetAlphamaps(0, 0, preterrain1.terrain.terrainData.GetAlphamaps(0, 0, 1, 1));
|
|
preterrain1.color_terrain = new Color(0.5f, 0.5f, 1f, 1f);
|
|
}
|
|
|
|
public virtual void terrain_all_reset_splat()
|
|
{
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
terrain_reset_splat(terrains[i]);
|
|
}
|
|
}
|
|
|
|
public virtual void texture_fill(Texture2D texture, Color color, bool apply)
|
|
{
|
|
if (texture == null)
|
|
{
|
|
return;
|
|
}
|
|
int width = texture.width;
|
|
int num = texture.height;
|
|
for (int i = 0; i < num; i++)
|
|
{
|
|
for (int j = 0; j < width; j++)
|
|
{
|
|
texture.SetPixel(j, i, color);
|
|
}
|
|
}
|
|
if (apply)
|
|
{
|
|
texture.Apply();
|
|
}
|
|
}
|
|
|
|
public virtual void terrain_reset_trees(terrain_class preterrain1, bool all)
|
|
{
|
|
if (!all)
|
|
{
|
|
if ((bool)preterrain1.terrain && (bool)preterrain1.terrain.terrainData)
|
|
{
|
|
preterrain1.terrain.terrainData.treeInstances = new TreeInstance[0];
|
|
preterrain1.color_terrain = new Color(0.5f, 0.5f, 1f, 1f);
|
|
}
|
|
return;
|
|
}
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if ((bool)terrains[i].terrain && (bool)terrains[i].terrain.terrainData)
|
|
{
|
|
terrains[i].terrain.terrainData.treeInstances = new TreeInstance[0];
|
|
terrains[i].terrain.Flush();
|
|
terrains[i].color_terrain = new Color(0.5f, 0.5f, 1f, 1f);
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void terrain_reset_grass(terrain_class preterrain1, bool all)
|
|
{
|
|
if (!preterrain1.terrain || !preterrain1.terrain.terrainData)
|
|
{
|
|
return;
|
|
}
|
|
int[,] array = (int[,])System.Array.CreateInstance(typeof(int), new int[2]
|
|
{
|
|
preterrain1.terrain.terrainData.detailResolution,
|
|
preterrain1.terrain.terrainData.detailResolution
|
|
});
|
|
int num = default(int);
|
|
if (!all)
|
|
{
|
|
if ((bool)preterrain1.terrain)
|
|
{
|
|
for (num = 0; num < preterrain1.terrain.terrainData.detailPrototypes.Length; num++)
|
|
{
|
|
preterrain1.terrain.terrainData.SetDetailLayer(0, 0, num, array);
|
|
}
|
|
preterrain1.color_terrain = new Color(0.5f, 0.5f, 1f, 1f);
|
|
}
|
|
return;
|
|
}
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if ((bool)terrains[i].terrain)
|
|
{
|
|
if ((float)terrains[i].terrain.terrainData.detailResolution != Mathf.Sqrt(array.Length))
|
|
{
|
|
array = (int[,])System.Array.CreateInstance(typeof(int), new int[2]
|
|
{
|
|
terrains[i].terrain.terrainData.detailResolution,
|
|
terrains[i].terrain.terrainData.detailResolution
|
|
});
|
|
}
|
|
for (num = 0; num < terrains[i].terrain.terrainData.detailPrototypes.Length; num++)
|
|
{
|
|
terrains[i].terrain.terrainData.SetDetailLayer(0, 0, num, array);
|
|
}
|
|
terrains[i].color_terrain = new Color(0.5f, 0.5f, 1f, 1f);
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual bool terrains_check_double(terrain_class preterrain)
|
|
{
|
|
bool result = false;
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if (terrains[i].terrain == preterrain.terrain && preterrain.terrain != null && !RuntimeServices.EqualityOperator(terrains[i], preterrain))
|
|
{
|
|
preterrain.terrain = null;
|
|
result = true;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual void erase_terrain(int number)
|
|
{
|
|
if (terrains.Count > 1)
|
|
{
|
|
terrains.RemoveAt(number);
|
|
}
|
|
else
|
|
{
|
|
terrains[number] = null;
|
|
}
|
|
if (terrains.Count == 1)
|
|
{
|
|
terrains[0].tile_x = 0f;
|
|
terrains[0].tile_z = 0f;
|
|
terrains[0].tiles = new Vector2(1f, 1f);
|
|
}
|
|
set_smooth_tool_terrain_popup();
|
|
set_terrain_text();
|
|
}
|
|
|
|
public virtual void restore_references()
|
|
{
|
|
GameObject gameObject = null;
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
GameObject gameObject2 = null;
|
|
if (terrains[i].name != string.Empty)
|
|
{
|
|
gameObject2 = GameObject.Find(terrains[i].name);
|
|
if ((bool)gameObject2)
|
|
{
|
|
terrains[i].terrain = (Terrain)gameObject2.GetComponent(typeof(Terrain));
|
|
}
|
|
}
|
|
}
|
|
for (int j = 0; j < prelayers.Count; j++)
|
|
{
|
|
for (int k = 0; k < prelayers[j].layer.Count; k++)
|
|
{
|
|
for (int l = 0; l < prelayers[j].layer[k].object_output.@object.Count; l++)
|
|
{
|
|
object_class object_class2 = prelayers[j].layer[k].object_output.@object[l];
|
|
if (object_class2.name != string.Empty && !object_class2.object1)
|
|
{
|
|
object_class2.object1 = GameObject.Find(object_class2.name);
|
|
}
|
|
if (object_class2.parent_name != string.Empty && !object_class2.parent)
|
|
{
|
|
gameObject = GameObject.Find(object_class2.parent_name);
|
|
if ((bool)gameObject)
|
|
{
|
|
object_class2.parent = gameObject.transform;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_references()
|
|
{
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if ((bool)terrains[i].terrain)
|
|
{
|
|
terrains[i].name = terrains[i].terrain.name;
|
|
}
|
|
}
|
|
for (int j = 0; j < prelayers.Count; j++)
|
|
{
|
|
for (int k = 0; k < prelayers[j].layer.Count; k++)
|
|
{
|
|
for (int l = 0; l < prelayers[j].layer[k].object_output.@object.Count; l++)
|
|
{
|
|
object_class object_class2 = prelayers[j].layer[k].object_output.@object[l];
|
|
if ((bool)object_class2.object1)
|
|
{
|
|
object_class2.name = object_class2.object1.name;
|
|
}
|
|
if ((bool)object_class2.parent)
|
|
{
|
|
object_class2.parent_name = object_class2.parent.name;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual float calc_color_pos(Color color, Color color_start, Color color_end)
|
|
{
|
|
Color color2 = color_start;
|
|
Color color3 = default(Color);
|
|
float num = default(float);
|
|
float num2 = default(float);
|
|
if (!(color_start.r <= color_end.r))
|
|
{
|
|
color_start.r = color_end.r;
|
|
color_end.r = color2.r;
|
|
}
|
|
if (!(color_start.g <= color_end.g))
|
|
{
|
|
color_start.g = color_end.g;
|
|
color_end.g = color2.g;
|
|
}
|
|
if (!(color_start.b <= color_end.b))
|
|
{
|
|
color_start.b = color_end.b;
|
|
color_end.b = color2.b;
|
|
}
|
|
color3 = color_end - color_start;
|
|
color -= color_start;
|
|
float result;
|
|
if (color.r < 0f || color.g < 0f || !(color.b >= 0f))
|
|
{
|
|
result = 0f;
|
|
}
|
|
else if (color.r > color3.r || color.g > color3.g || !(color.b <= color3.b))
|
|
{
|
|
result = 0f;
|
|
}
|
|
else
|
|
{
|
|
num += color3.r + color3.g + color3.b;
|
|
num2 += color.r + color.g + color.b;
|
|
result = ((num == 0f) ? 1f : (num2 / num));
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual bool color_in_range(Color color, Color color_start, Color color_end)
|
|
{
|
|
Color color2 = color_start;
|
|
if (!(color_start.r <= color_end.r))
|
|
{
|
|
color_start.r = color_end.r;
|
|
color_end.r = color2.r;
|
|
}
|
|
if (!(color_start.g <= color_end.g))
|
|
{
|
|
color_start.g = color_end.g;
|
|
color_end.g = color2.g;
|
|
}
|
|
if (!(color_start.b <= color_end.b))
|
|
{
|
|
color_start.b = color_end.b;
|
|
color_end.b = color2.b;
|
|
}
|
|
return (!(color.r < color_start.r) && !(color.r > color_end.r) && !(color.g < color_start.g) && !(color.g > color_end.g) && !(color.b < color_start.b) && !(color.b > color_end.b)) ? true : false;
|
|
}
|
|
|
|
public virtual Color random_color_from_range(Color color_start, Color color_end)
|
|
{
|
|
Color result = default(Color);
|
|
AnimationCurve animationCurve = AnimationCurve.Linear(0f, color_start.r, 1f, color_end.r);
|
|
AnimationCurve animationCurve2 = AnimationCurve.Linear(0f, color_start.g, 1f, color_end.g);
|
|
AnimationCurve animationCurve3 = AnimationCurve.Linear(0f, color_start.b, 1f, color_end.b);
|
|
float time = UnityEngine.Random.Range(0f, 1f);
|
|
result.r = animationCurve.Evaluate(time);
|
|
result.g = animationCurve2.Evaluate(time);
|
|
result.b = animationCurve3.Evaluate(time);
|
|
result.a = 1f;
|
|
return result;
|
|
}
|
|
|
|
public virtual void convert_16to8_bit(float value)
|
|
{
|
|
value *= 65535f;
|
|
ushort num = (ushort)value;
|
|
byte_hi = (int)((uint)num >> 8);
|
|
byte_lo = num - (byte_hi << 8);
|
|
}
|
|
|
|
public virtual void convert_24to8_bit(float value)
|
|
{
|
|
value *= 8388608f;
|
|
uint num = (uint)value;
|
|
byte_hi2 = (int)(num >> 16);
|
|
byte_hi = (int)((long)(int)num - (long)(byte_hi2 << 16) >> 8);
|
|
byte_lo = (int)((long)(int)num - (long)(byte_hi2 << 16) - (byte_hi << 8));
|
|
}
|
|
|
|
public virtual int export_meshcapture()
|
|
{
|
|
int result;
|
|
if (!meshcapture_tool_object)
|
|
{
|
|
result = -1;
|
|
}
|
|
else
|
|
{
|
|
MeshFilter[] componentsInChildren = meshcapture_tool_object.GetComponentsInChildren<MeshFilter>();
|
|
Vector3[] array = null;
|
|
meshcapture_tool_image = new Texture2D(meshcapture_tool_image_width, meshcapture_tool_image_height);
|
|
Vector3[] array2 = new Vector3[3];
|
|
int[] array3 = null;
|
|
Mesh mesh = null;
|
|
Vector3 vector = default(Vector3);
|
|
Vector3 vector2 = default(Vector3);
|
|
Transform transform = null;
|
|
meshcapture_tool_image.wrapMode = TextureWrapMode.Clamp;
|
|
vector = ((!meshcapture_tool_pivot) ? meshcapture_tool_object.transform.position : meshcapture_tool_pivot.position);
|
|
if (componentsInChildren != null)
|
|
{
|
|
Color[] array4 = new Color[meshcapture_tool_image_width * meshcapture_tool_image_height];
|
|
int i = 0;
|
|
Color[] array5 = array4;
|
|
for (int length = array5.Length; i < length; i++)
|
|
{
|
|
array5[i] = meshcapture_background_color;
|
|
}
|
|
meshcapture_tool_image.SetPixels(array4);
|
|
int j = 0;
|
|
MeshFilter[] array6 = componentsInChildren;
|
|
for (int length2 = array6.Length; j < length2; j++)
|
|
{
|
|
mesh = ((MeshFilter)array6[j].GetComponent(typeof(MeshFilter))).sharedMesh;
|
|
if (!mesh)
|
|
{
|
|
continue;
|
|
}
|
|
array = mesh.vertices;
|
|
array3 = mesh.triangles;
|
|
transform = array6[j].gameObject.transform;
|
|
Vector3[] normals = mesh.normals;
|
|
for (int k = 0; k < array3.Length / 3; k++)
|
|
{
|
|
int num = array3[k * 3];
|
|
int num2 = array3[k * 3 + 1];
|
|
int num3 = array3[k * 3 + 2];
|
|
array2[0] = transform.TransformPoint(array[num]) - vector;
|
|
array2[1] = transform.TransformPoint(array[num2]) - vector;
|
|
array2[2] = transform.TransformPoint(array[num3]) - vector;
|
|
Vector3 vector3 = array2[0];
|
|
Vector3 vector4 = normals[num];
|
|
vector4.Normalize();
|
|
vector3.Normalize();
|
|
color1 = meshcapture_tool_color;
|
|
if (meshcapture_tool_shadows)
|
|
{
|
|
color1.r = Mathf.Abs((vector4.x + vector4.y + vector4.z) / 3f);
|
|
color1.g = Mathf.Abs((vector4.x + vector4.y + vector4.z) / 3f);
|
|
color1.b = Mathf.Abs((vector4.x + vector4.y + vector4.z) / 3f);
|
|
color1.r *= meshcapture_tool_color.r;
|
|
color1.g *= meshcapture_tool_color.g;
|
|
color1.b *= meshcapture_tool_color.b;
|
|
}
|
|
array2[0].x = array2[0].x * meshcapture_tool_scale;
|
|
array2[0].z = array2[0].z * meshcapture_tool_scale;
|
|
array2[0].y = array2[0].y * meshcapture_tool_scale;
|
|
array2[0].x = array2[0].x + (float)(meshcapture_tool_image_width / 2);
|
|
array2[0].z = array2[0].z + (float)(meshcapture_tool_image_height / 2);
|
|
array2[0].y = array2[0].y + (float)(meshcapture_tool_image_height / 2);
|
|
array2[1].x = array2[1].x * meshcapture_tool_scale;
|
|
array2[1].z = array2[1].z * meshcapture_tool_scale;
|
|
array2[1].y = array2[1].y * meshcapture_tool_scale;
|
|
array2[1].x = array2[1].x + (float)(meshcapture_tool_image_width / 2);
|
|
array2[1].z = array2[1].z + (float)(meshcapture_tool_image_height / 2);
|
|
array2[1].y = array2[1].y + (float)(meshcapture_tool_image_height / 2);
|
|
array2[2].x = array2[2].x * meshcapture_tool_scale;
|
|
array2[2].z = array2[2].z * meshcapture_tool_scale;
|
|
array2[2].y = array2[2].y * meshcapture_tool_scale;
|
|
array2[2].x = array2[2].x + (float)(meshcapture_tool_image_width / 2);
|
|
array2[2].z = array2[2].z + (float)(meshcapture_tool_image_height / 2);
|
|
array2[2].y = array2[2].y + (float)(meshcapture_tool_image_height / 2);
|
|
float num4 = 0f;
|
|
float num5 = 700f;
|
|
float num6 = 900f;
|
|
Line(meshcapture_tool_image, (int)(array2[0].x - num4), (int)array2[0].z, (int)(array2[1].x - num4), (int)array2[1].z, color1);
|
|
Line(meshcapture_tool_image, (int)(array2[0].x - num4), (int)array2[0].z, (int)(array2[2].x - num4), (int)array2[2].z, color1);
|
|
Line(meshcapture_tool_image, (int)(array2[1].x - num4), (int)array2[1].z, (int)(array2[2].x - num4), (int)array2[2].z, color1);
|
|
}
|
|
}
|
|
if (meshcapture_tool_save_scale)
|
|
{
|
|
Color color = convert_float_to_color(meshcapture_tool_scale);
|
|
Color color2 = default(Color);
|
|
color2 = meshcapture_tool_image.GetPixel(0, 0);
|
|
color2[3] = color[0];
|
|
meshcapture_tool_image.SetPixel(0, 0, color2);
|
|
color2 = meshcapture_tool_image.GetPixel(1, 0);
|
|
color2[3] = color[1];
|
|
meshcapture_tool_image.SetPixel(1, 0, color2);
|
|
color2 = meshcapture_tool_image.GetPixel(2, 0);
|
|
color2[3] = color[2];
|
|
meshcapture_tool_image.SetPixel(2, 0, color2);
|
|
color2 = meshcapture_tool_image.GetPixel(3, 0);
|
|
color2[3] = color[3];
|
|
meshcapture_tool_image.SetPixel(3, 0, color2);
|
|
}
|
|
meshcapture_tool_image.Apply();
|
|
}
|
|
result = 1;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual void Line(Texture2D tex, int x0, int y0, int x1, int y1, Color col)
|
|
{
|
|
int num = y1 - y0;
|
|
int num2 = x1 - x0;
|
|
int num3 = default(int);
|
|
int num4 = default(int);
|
|
if (num < 0)
|
|
{
|
|
num = -num;
|
|
num4 = -1;
|
|
}
|
|
else
|
|
{
|
|
num4 = 1;
|
|
}
|
|
if (num2 < 0)
|
|
{
|
|
num2 = -num2;
|
|
num3 = -1;
|
|
}
|
|
else
|
|
{
|
|
num3 = 1;
|
|
}
|
|
num <<= 1;
|
|
num2 <<= 1;
|
|
tex.SetPixel(x0, y0, col);
|
|
int num5;
|
|
if (num2 > num)
|
|
{
|
|
num5 = num - (num2 >> 1);
|
|
while (x0 != x1)
|
|
{
|
|
if (num5 >= 0)
|
|
{
|
|
y0 += num4;
|
|
num5 -= num2;
|
|
}
|
|
x0 += num3;
|
|
num5 += num;
|
|
tex.SetPixel(x0, y0, col);
|
|
}
|
|
return;
|
|
}
|
|
num5 = num2 - (num >> 1);
|
|
while (y0 != y1)
|
|
{
|
|
if (num5 >= 0)
|
|
{
|
|
x0 += num3;
|
|
num5 -= num;
|
|
}
|
|
y0 += num4;
|
|
num5 += num2;
|
|
tex.SetPixel(x0, y0, col);
|
|
}
|
|
}
|
|
|
|
public virtual void texture_fill_color(Texture2D texture1, Color color)
|
|
{
|
|
float num = texture1.width * texture1.height;
|
|
Color[] array = new Color[(int)num];
|
|
int i = 0;
|
|
Color[] array2 = array;
|
|
for (int length = array2.Length; i < length; i++)
|
|
{
|
|
array2[i] = color;
|
|
}
|
|
texture1.SetPixels(0, 0, texture1.width, texture1.height, array);
|
|
}
|
|
|
|
public virtual void tree_placed_reset()
|
|
{
|
|
for (int i = 0; i < prelayer.layer.Count; i++)
|
|
{
|
|
if (prelayer.layer[i].output == layer_output_enum.tree)
|
|
{
|
|
for (int j = 0; j < prelayer.layer[i].tree_output.tree.Count; j++)
|
|
{
|
|
prelayer.layer[i].tree_output.tree[j].placed = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void disable_outputs()
|
|
{
|
|
heightmap_output = false;
|
|
color_output = false;
|
|
splat_output = false;
|
|
tree_output = false;
|
|
grass_output = false;
|
|
object_output = false;
|
|
}
|
|
|
|
public virtual bool check_treemap()
|
|
{
|
|
int num = 0;
|
|
int result;
|
|
while (true)
|
|
{
|
|
if (num < settings.treemap.Count)
|
|
{
|
|
if ((bool)settings.treemap[num].map && settings.treemap[num].load)
|
|
{
|
|
result = 1;
|
|
break;
|
|
}
|
|
num++;
|
|
continue;
|
|
}
|
|
result = 0;
|
|
break;
|
|
}
|
|
return (byte)result != 0;
|
|
}
|
|
|
|
public virtual bool check_grassmap()
|
|
{
|
|
int num = 0;
|
|
int result;
|
|
while (true)
|
|
{
|
|
if (num < settings.grassmap.Count)
|
|
{
|
|
if ((bool)settings.grassmap[num].map && settings.grassmap[num].load)
|
|
{
|
|
result = 1;
|
|
break;
|
|
}
|
|
num++;
|
|
continue;
|
|
}
|
|
result = 0;
|
|
break;
|
|
}
|
|
return (byte)result != 0;
|
|
}
|
|
|
|
public virtual int generate_begin_mesh()
|
|
{
|
|
prelayer = prelayers[0];
|
|
UnityEngine.Random.seed = seed;
|
|
prelayer.count_terrain = 0;
|
|
for (int i = 0; i < meshes.Count; i++)
|
|
{
|
|
if (!meshes[i].gameObject || !meshes[i].meshFilter || !meshes[i].mesh || !meshes[i].active)
|
|
{
|
|
meshes.RemoveAt(i);
|
|
i--;
|
|
}
|
|
}
|
|
get_meshes_areas();
|
|
calc_total_mesh_area();
|
|
get_meshes_minmax_height();
|
|
generate_pause = false;
|
|
prelayer_stack.Add(0);
|
|
link_placed_reference();
|
|
loop_prelayer("(gfc)(slv)(ocr)(asr)(cpo)(ias)(eho)(st)(cmn)(ed)", 0, false);
|
|
int result;
|
|
if (!find_mesh())
|
|
{
|
|
result = -1;
|
|
}
|
|
else if (prelayer.layer.Count == 0)
|
|
{
|
|
result = -2;
|
|
}
|
|
else
|
|
{
|
|
if (prelayers.Count > 1)
|
|
{
|
|
area_stack_enabled = true;
|
|
}
|
|
load_raw_heightmaps();
|
|
generate_time_start = Time.realtimeSinceStartup;
|
|
generate_time = 0f;
|
|
tree_number = 0;
|
|
auto_speed_time = Time.realtimeSinceStartup;
|
|
generate_mesh_start();
|
|
result = 1;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual int generate_begin()
|
|
{
|
|
if (heightmap_output && !color_output && !splat_output && !tree_output && !grass_output && !object_output)
|
|
{
|
|
only_heightmap = true;
|
|
}
|
|
prelayer = prelayers[0];
|
|
UnityEngine.Random.seed = seed;
|
|
prelayer.count_terrain = 0;
|
|
generate_world_mode = prelayers[0].prearea.active;
|
|
int num = 0;
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
terrains[i].index = i;
|
|
terrains[i].index_old = num;
|
|
num++;
|
|
if (!terrains[i].terrain)
|
|
{
|
|
terrains.RemoveAt(i);
|
|
i--;
|
|
}
|
|
else if (!terrains[i].terrain.terrainData)
|
|
{
|
|
terrains.RemoveAt(i);
|
|
i--;
|
|
}
|
|
}
|
|
assign_all_terrain_splat_alpha();
|
|
int result;
|
|
if (terrains.Count == 0)
|
|
{
|
|
result = -2;
|
|
}
|
|
else
|
|
{
|
|
get_terrains_position();
|
|
int i = 0;
|
|
while (true)
|
|
{
|
|
if (i < terrains.Count)
|
|
{
|
|
terrains[i].heightmap_resolution = terrains[i].terrain.terrainData.heightmapResolution;
|
|
terrains[i].splatmap_resolution = terrains[i].terrain.terrainData.alphamapResolution;
|
|
terrains[i].detail_resolution = terrains[i].terrain.terrainData.detailResolution;
|
|
if (terrains[i].prearea.resolution_mode == resolution_mode_enum.Automatic)
|
|
{
|
|
select_automatic_step_resolution(terrains[i], terrains[i].prearea);
|
|
}
|
|
set_area_resolution(terrains[i], terrains[i].prearea);
|
|
terrains[i].prearea.round_area_to_step(terrains[i].prearea.area);
|
|
terrains[i].prearea.area_old = terrains[i].prearea.area;
|
|
if (!world_output)
|
|
{
|
|
terrains[i].prearea.area.x = terrains[i].prearea.area.x + terrains[i].terrain.transform.position.x;
|
|
terrains[i].prearea.area.y = terrains[i].prearea.area.y + terrains[i].terrain.transform.position.z;
|
|
}
|
|
if (!object_output)
|
|
{
|
|
terrains[i].prearea.area.xMax = terrains[i].prearea.area.xMax + terrains[i].prearea.step.x / 2f;
|
|
terrains[i].prearea.area.yMin = terrains[i].prearea.area.yMin - terrains[i].prearea.step.y / 2f;
|
|
}
|
|
if (color_output)
|
|
{
|
|
terrains[i].color_length = 3;
|
|
terrains[i].color = new float[3];
|
|
terrains[i].color_layer = new float[3];
|
|
}
|
|
if (splat_output)
|
|
{
|
|
terrains[i].splat_length = terrains[i].terrain.terrainData.splatPrototypes.Length;
|
|
if (terrains[i].splat_length == 0 && (color_output || splat_output))
|
|
{
|
|
preterrain = terrains[i];
|
|
result = -3;
|
|
break;
|
|
}
|
|
if (terrains[i].splat_length == 1 && splat_output)
|
|
{
|
|
preterrain = terrains[i];
|
|
result = -5;
|
|
break;
|
|
}
|
|
if (terrains[i].splat_length < terrains[0].splat_length)
|
|
{
|
|
preterrain = terrains[i];
|
|
result = -7;
|
|
break;
|
|
}
|
|
terrains[i].splat = new float[terrains[i].splat_length];
|
|
terrains[i].splat_calc = new float[terrains[i].splat_length];
|
|
terrains[i].splat_layer = new float[(int)(Mathf.Ceil((float)terrains[i].splat_length / 4f) * 4f)];
|
|
}
|
|
if (button_export && !export_texture)
|
|
{
|
|
export_texture = new Texture2D((int)terrains[0].prearea.resolution, (int)terrains[0].prearea.resolution, TextureFormat.RGB24, false);
|
|
}
|
|
if (grass_output)
|
|
{
|
|
if (terrains[i].terrain.terrainData.detailPrototypes.Length < terrains[0].terrain.terrainData.detailPrototypes.Length)
|
|
{
|
|
preterrain = terrains[i];
|
|
result = -8;
|
|
break;
|
|
}
|
|
terrains[i].grass = new float[terrains[i].terrain.terrainData.detailPrototypes.Length];
|
|
}
|
|
i++;
|
|
continue;
|
|
}
|
|
if (heightmap_output)
|
|
{
|
|
heights = (float[,])System.Array.CreateInstance(typeof(float), new int[2]
|
|
{
|
|
terrains[0].terrain.terrainData.heightmapResolution,
|
|
terrains[0].terrain.terrainData.heightmapResolution
|
|
});
|
|
}
|
|
if (grass_output)
|
|
{
|
|
grass_detail = new detail_class[terrains[0].terrain.terrainData.detailPrototypes.Length];
|
|
for (int j = 0; j < grass_detail.Length; j++)
|
|
{
|
|
grass_detail[j] = new detail_class();
|
|
grass_detail[j].detail = (int[,])System.Array.CreateInstance(typeof(int), new int[2]
|
|
{
|
|
(int)terrains[0].detail_resolution,
|
|
(int)terrains[0].detail_resolution
|
|
});
|
|
}
|
|
grass_resolution_old = (int)preterrain.detail_resolution;
|
|
}
|
|
generate_pause = false;
|
|
prelayer_stack.Add(0);
|
|
link_placed_reference();
|
|
loop_prelayer("(gfc)(slv)(ocr)(asr)(cpo)(ias)(eho)(st)(cmn)(ed)", 0, false);
|
|
if (!find_terrain(true))
|
|
{
|
|
result = -1;
|
|
break;
|
|
}
|
|
preterrain = terrains[prelayer.count_terrain];
|
|
if (generate_world_mode)
|
|
{
|
|
}
|
|
load_raw_heightmaps();
|
|
if (!heightmap_output_layer)
|
|
{
|
|
heightmap_output = false;
|
|
}
|
|
if (prelayer.layer.Count == 0 && (!tree_output || !check_treemap()) && (!grass_output || !check_grassmap()))
|
|
{
|
|
result = -2;
|
|
break;
|
|
}
|
|
if (prelayers.Count > 1)
|
|
{
|
|
area_stack_enabled = true;
|
|
}
|
|
generate_time_start = Time.realtimeSinceStartup;
|
|
generate_time = 0f;
|
|
tree_number = 0;
|
|
auto_speed_time = Time.realtimeSinceStartup;
|
|
generate_terrain_start();
|
|
result = 1;
|
|
break;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual int GenerateHeightmapBegin()
|
|
{
|
|
only_heightmap = true;
|
|
prelayer = prelayers[0];
|
|
UnityEngine.Random.seed = seed;
|
|
prelayer.count_terrain = 0;
|
|
generate_world_mode = prelayers[0].prearea.active;
|
|
generate_pause = false;
|
|
prelayer_stack.Add(0);
|
|
int result;
|
|
if (!find_terrain(true))
|
|
{
|
|
result = -1;
|
|
}
|
|
else
|
|
{
|
|
preterrain = terrains[prelayer.count_terrain];
|
|
load_raw_heightmaps();
|
|
if (!heightmap_output_layer)
|
|
{
|
|
heightmap_output = false;
|
|
}
|
|
if (prelayers.Count > 1)
|
|
{
|
|
area_stack_enabled = true;
|
|
}
|
|
generate_time_start = Time.realtimeSinceStartup;
|
|
generate_time = 0f;
|
|
auto_speed_time = Time.realtimeSinceStartup;
|
|
generate_terrain_start();
|
|
result = 1;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual void select_automatic_step_resolution(terrain_class preterrain1, area_class prearea)
|
|
{
|
|
int num = 0;
|
|
if (preterrain1.terrain.terrainData.heightmapResolution > num && heightmap_output)
|
|
{
|
|
num = preterrain1.terrain.terrainData.heightmapResolution;
|
|
prearea.resolution_mode = resolution_mode_enum.Heightmap;
|
|
}
|
|
if (preterrain1.terrain.terrainData.alphamapResolution > num && color_output)
|
|
{
|
|
num = colormap_resolution;
|
|
prearea.resolution_mode = resolution_mode_enum.Colormap;
|
|
}
|
|
if (preterrain1.terrain.terrainData.alphamapResolution > num && splat_output)
|
|
{
|
|
num = preterrain1.terrain.terrainData.alphamapResolution;
|
|
prearea.resolution_mode = resolution_mode_enum.Splatmap;
|
|
}
|
|
if (preterrain1.terrain.terrainData.detailResolution > num && grass_output)
|
|
{
|
|
num = preterrain1.terrain.terrainData.detailResolution;
|
|
prearea.resolution_mode = resolution_mode_enum.Detailmap;
|
|
}
|
|
if (prearea.tree_resolution > num && tree_output)
|
|
{
|
|
num = prearea.tree_resolution;
|
|
prearea.resolution_mode = resolution_mode_enum.Tree;
|
|
}
|
|
if (prearea.object_resolution > num && object_output)
|
|
{
|
|
num = prearea.object_resolution;
|
|
prearea.resolution_mode = resolution_mode_enum.Object;
|
|
}
|
|
if (num == 0)
|
|
{
|
|
num = 4;
|
|
prearea.resolution_mode = resolution_mode_enum.Detailmap;
|
|
}
|
|
}
|
|
|
|
public virtual void select_automatic_step_resolution_mesh(area_class prearea)
|
|
{
|
|
resolution = object_resolution;
|
|
prearea.resolution_mode = resolution_mode_enum.Object;
|
|
}
|
|
|
|
public virtual void generate_mesh_start()
|
|
{
|
|
premesh = meshes[prelayer.count_terrain];
|
|
Rect rect = get_mesh_area(prelayer.count_terrain);
|
|
rect.xMin = Mathf.Ceil(rect.xMin / object_resolution) * object_resolution;
|
|
rect.yMin = Mathf.Ceil(rect.yMin / object_resolution) * object_resolution;
|
|
rect.xMax = Mathf.Floor(rect.xMax / object_resolution) * object_resolution;
|
|
rect.yMax = Mathf.Floor(rect.yMax / object_resolution) * object_resolution;
|
|
prelayer.prearea.area.xMin = rect.xMin;
|
|
prelayer.prearea.area.yMin = rect.yMin;
|
|
prelayer.prearea.area.width = rect.width;
|
|
prelayer.prearea.area.height = rect.height;
|
|
prelayer.y = prelayer.prearea.area.yMax;
|
|
}
|
|
|
|
public virtual Rect get_mesh_area(int count_terrain)
|
|
{
|
|
return new Rect
|
|
{
|
|
xMin = meshes[count_terrain].mesh.bounds.center.x - meshes[count_terrain].mesh.bounds.extents.x + meshes[count_terrain].gameObject.transform.position.x,
|
|
yMin = meshes[count_terrain].mesh.bounds.center.z - meshes[count_terrain].mesh.bounds.extents.z + meshes[count_terrain].gameObject.transform.position.z,
|
|
width = meshes[count_terrain].mesh.bounds.size.x,
|
|
height = meshes[count_terrain].mesh.bounds.size.z
|
|
};
|
|
}
|
|
|
|
public virtual void get_meshes_areas()
|
|
{
|
|
for (int i = 0; i < meshes.Count; i++)
|
|
{
|
|
meshes[i].area = get_mesh_area(i);
|
|
}
|
|
}
|
|
|
|
public virtual void calc_total_mesh_area()
|
|
{
|
|
Rect rect = default(Rect);
|
|
meshes_area.area = get_mesh_area(0);
|
|
for (int i = 1; i < meshes.Count; i++)
|
|
{
|
|
rect = get_mesh_area(i);
|
|
if (!(rect.xMin >= meshes_area.area.xMin))
|
|
{
|
|
meshes_area.area.xMin = rect.xMin;
|
|
}
|
|
if (!(rect.xMax <= meshes_area.area.xMax))
|
|
{
|
|
meshes_area.area.xMax = rect.xMax;
|
|
}
|
|
if (!(rect.yMin >= meshes_area.area.yMin))
|
|
{
|
|
meshes_area.area.yMin = rect.yMin;
|
|
}
|
|
if (!(rect.yMax <= meshes_area.area.yMax))
|
|
{
|
|
meshes_area.area.yMax = rect.yMax;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void GetMeshHeightSlope(mesh_class premesh1, Vector2 position)
|
|
{
|
|
Ray ray = new Ray
|
|
{
|
|
direction = new Vector3(0f, -1f, 0f),
|
|
origin = new Vector3(position.x, premesh1.transform.position.y + 1000f, position.y)
|
|
};
|
|
RaycastHit hitInfo = default(RaycastHit);
|
|
RaycastHit raycastHit = default(RaycastHit);
|
|
if (Physics.Raycast(ray, out hitInfo, 2000f) && (hitInfo.collider.gameObject.layer & meshes_layer) == meshes_layer)
|
|
{
|
|
mesh_measure.hit = true;
|
|
mesh_measure.height = hitInfo.point.y;
|
|
mesh_measure.degree = 1f - (hitInfo.normal.y - 0.5f) * 2f;
|
|
mesh_measure.normal = hitInfo.normal;
|
|
mesh_measure.transform = hitInfo.transform;
|
|
}
|
|
else
|
|
{
|
|
mesh_measure.hit = false;
|
|
}
|
|
}
|
|
|
|
public virtual void generate_terrain_start()
|
|
{
|
|
if (!generate_world_mode)
|
|
{
|
|
prelayer.prearea = preterrain.prearea;
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
terrains[i].on_row = false;
|
|
}
|
|
preterrain.on_row = true;
|
|
}
|
|
prelayer.y = prelayer.prearea.area.yMax;
|
|
select_image_prelayer();
|
|
if (button_export && heightmap_output)
|
|
{
|
|
export_bytes = new byte[(int)(Mathf.Pow(preterrain.terrain.terrainData.heightmapResolution, 2f) * 2f)];
|
|
}
|
|
}
|
|
|
|
public virtual int generate_output(prelayer_class prelayer3)
|
|
{
|
|
generate_error = true;
|
|
int result;
|
|
if (prelayer3.prearea.step.x == 0f || prelayer3.prearea.step.y == 0f)
|
|
{
|
|
generate = false;
|
|
Debug.Log("Area size is 0...");
|
|
result = -1;
|
|
}
|
|
else
|
|
{
|
|
frames = 1f / (Time.realtimeSinceStartup - auto_speed_time);
|
|
auto_speed_time = Time.realtimeSinceStartup;
|
|
generate_speed = 10000;
|
|
break_x = false;
|
|
row_object_count = 0;
|
|
prelayer3.counter_y = prelayer3.y;
|
|
GameObject gameObject = default(GameObject);
|
|
Color color = default(Color);
|
|
int l = default(int);
|
|
while (true)
|
|
{
|
|
object_class object_class2;
|
|
Quaternion rotation;
|
|
if (prelayer3.counter_y >= prelayer3.y - (float)generate_speed * prelayer.prearea.step.y)
|
|
{
|
|
generate_call_time = Time.realtimeSinceStartup;
|
|
float y = prelayer3.y;
|
|
int num = default(int);
|
|
if (!(prelayer3.counter_y >= prelayer3.prearea.area.yMin))
|
|
{
|
|
if (prelayer_stack.Count > 1)
|
|
{
|
|
prelayer_stack.RemoveAt(prelayer_stack.Count - 1);
|
|
prelayer = prelayers[prelayer_stack[prelayer_stack.Count - 1]];
|
|
generate_error = false;
|
|
result = 2;
|
|
break;
|
|
}
|
|
if (generate_world_mode)
|
|
{
|
|
generate = false;
|
|
for (num = 0; num < terrains.Count; num++)
|
|
{
|
|
terrain_apply(terrains[num]);
|
|
}
|
|
}
|
|
else if (settings.showTerrains)
|
|
{
|
|
if (prelayer3.count_terrain >= terrains.Count - 1)
|
|
{
|
|
generate = false;
|
|
}
|
|
terrain_apply(terrains[prelayer3.count_terrain]);
|
|
}
|
|
else if (prelayer3.count_terrain >= meshes.Count - 1)
|
|
{
|
|
generate = false;
|
|
}
|
|
if (button_export)
|
|
{
|
|
export_name = export_file;
|
|
if (terrains.Count > 1)
|
|
{
|
|
export_name += "_" + prelayer.count_terrain;
|
|
}
|
|
if ((settings.colormap || (bool)preterrain.rtp_script) && (settings.colormap_auto_assign || settings.normalmap_auto_assign))
|
|
{
|
|
script_base.preterrain = script_base.terrains[prelayer3.count_terrain];
|
|
}
|
|
generate_export = 1;
|
|
}
|
|
generate_time = Time.realtimeSinceStartup - generate_time_start;
|
|
if (generate)
|
|
{
|
|
prelayer3.count_terrain++;
|
|
if (settings.showTerrains)
|
|
{
|
|
if (find_terrain(false))
|
|
{
|
|
preterrain = terrains[prelayer3.count_terrain];
|
|
generate_terrain_start();
|
|
}
|
|
else
|
|
{
|
|
generate = false;
|
|
}
|
|
}
|
|
else if (find_mesh())
|
|
{
|
|
generate_mesh_start();
|
|
}
|
|
else
|
|
{
|
|
generate = false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
object_apply();
|
|
}
|
|
generate_error = false;
|
|
result = 2;
|
|
break;
|
|
}
|
|
if (generate_world_mode || prelayer3.index > 0)
|
|
{
|
|
for (num = 0; num < terrains.Count; num++)
|
|
{
|
|
if (terrains[num].rect.Contains(new Vector2(terrains[num].prearea.area.x, y)))
|
|
{
|
|
terrains[num].on_row = true;
|
|
}
|
|
else
|
|
{
|
|
terrains[num].on_row = false;
|
|
}
|
|
}
|
|
}
|
|
prelayer3.x = prelayer3.prearea.area.x + prelayer3.break_x_value;
|
|
for (; prelayer3.x <= prelayer3.prearea.area.xMax; prelayer3.x += prelayer3.prearea.step.x)
|
|
{
|
|
float x = prelayer3.x;
|
|
float num2 = default(float);
|
|
float num3 = default(float);
|
|
float num4 = default(float);
|
|
float num5 = prelayer3.counter_y;
|
|
if (generate_world_mode || prelayer3.index > 0)
|
|
{
|
|
bool flag = true;
|
|
for (num = 0; num < terrains.Count; num++)
|
|
{
|
|
if (terrains[num].rect.Contains(new Vector2(x, num5)))
|
|
{
|
|
flag = false;
|
|
preterrain = terrains[num];
|
|
break;
|
|
}
|
|
}
|
|
if (flag)
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
local_x = x - preterrain.rect.x;
|
|
local_y = num5 - preterrain.rect.y;
|
|
if (prelayer3.prearea.rotation_active)
|
|
{
|
|
Vector2 vector = calc_rotation_pixel(x, num5, prelayer3.prearea.center.x, prelayer3.prearea.center.y, prelayer3.prearea.rotation.y);
|
|
x = vector.x;
|
|
num5 = vector.y;
|
|
}
|
|
local_x_rot = x - preterrain.rect.x;
|
|
local_y_rot = num5 - preterrain.rect.y;
|
|
if (!only_heightmap)
|
|
{
|
|
if (settings.showTerrains)
|
|
{
|
|
degree = calc_terrain_angle(preterrain, local_x_rot, local_y_rot, settings.smooth_angle) * settings.global_degree_strength + settings.global_degree_level;
|
|
height = preterrain.terrain.terrainData.GetHeight((int)(local_x_rot / preterrain.heightmap_conversion.x), (int)(local_y_rot / preterrain.heightmap_conversion.y)) / preterrain.size.y * settings.global_height_strength + settings.global_height_level;
|
|
if (measure_normal)
|
|
{
|
|
normal = preterrain.terrain.terrainData.GetInterpolatedNormal(local_x_rot / preterrain.size.x, local_y_rot / preterrain.size.z);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
GetMeshHeightSlope(premesh, new Vector2(x, num5));
|
|
if (!mesh_measure.hit)
|
|
{
|
|
continue;
|
|
}
|
|
degree = mesh_measure.degree * 90f;
|
|
height = (mesh_measure.height - mesh_measure.transform.position.y) / meshes_heightscale;
|
|
normal = mesh_measure.normal;
|
|
}
|
|
}
|
|
random_range = UnityEngine.Random.Range(0f, 1000f);
|
|
if (!heightmap_output)
|
|
{
|
|
map_x = (int)Mathf.Round(local_x_rot / preterrain.splatmap_conversion.x);
|
|
map_y = (int)Mathf.Round(local_y_rot / preterrain.splatmap_conversion.y);
|
|
if (!((float)map_y <= preterrain.splatmap_resolution - 1f))
|
|
{
|
|
map_y = (int)(preterrain.splatmap_resolution - 1f);
|
|
}
|
|
else if (map_y < 0)
|
|
{
|
|
map_y = 0;
|
|
}
|
|
if (!((float)map_x <= preterrain.splatmap_resolution - 1f))
|
|
{
|
|
map_x = (int)(preterrain.splatmap_resolution - 1f);
|
|
}
|
|
else if (map_x < 0)
|
|
{
|
|
map_x = 0;
|
|
}
|
|
}
|
|
if (grass_output)
|
|
{
|
|
detailmap_x = (int)Mathf.Floor(local_x_rot / preterrain.detailmap_conversion.x);
|
|
detailmap_y = (int)Mathf.Floor(local_y_rot / preterrain.detailmap_conversion.y);
|
|
if (!((float)detailmap_x <= preterrain.detail_resolution - 1f))
|
|
{
|
|
detailmap_x = (int)(preterrain.detail_resolution - 1f);
|
|
}
|
|
else if (detailmap_x < 0)
|
|
{
|
|
detailmap_x = 0;
|
|
}
|
|
if (!((float)detailmap_y <= preterrain.detail_resolution - 1f))
|
|
{
|
|
detailmap_y = (int)(preterrain.detail_resolution - 1f);
|
|
}
|
|
else if (detailmap_y < 0)
|
|
{
|
|
detailmap_y = 0;
|
|
}
|
|
}
|
|
else if (heightmap_output)
|
|
{
|
|
heightmap_x = (int)Mathf.Round(local_x_rot / preterrain.heightmap_conversion.x);
|
|
heightmap_y = (int)Mathf.Round(local_y_rot / preterrain.heightmap_conversion.y);
|
|
heightmap_x_old = heightmap_x;
|
|
heightmap_y_old = heightmap_y;
|
|
if (!((float)heightmap_y <= preterrain.heightmap_resolution - 1f))
|
|
{
|
|
heightmap_y = (int)(preterrain.heightmap_resolution - 1f);
|
|
}
|
|
else if (heightmap_y < 0)
|
|
{
|
|
heightmap_y = 0;
|
|
}
|
|
if (!((float)heightmap_x <= preterrain.heightmap_resolution - 1f))
|
|
{
|
|
heightmap_x = (int)(preterrain.heightmap_resolution - 1f);
|
|
}
|
|
else if (heightmap_x < 0)
|
|
{
|
|
heightmap_x = 0;
|
|
}
|
|
heights[heightmap_y, heightmap_x] = 0f;
|
|
}
|
|
overlap = false;
|
|
for (int i = 0; i < prelayer3.layer.Count; i++)
|
|
{
|
|
current_layer = prelayer3.layer[i];
|
|
filter_value = 0f;
|
|
filter_strength = 1f;
|
|
if (current_layer.output == layer_output_enum.heightmap)
|
|
{
|
|
layer_x = (float)heightmap_x * preterrain.heightmap_conversion.x;
|
|
layer_y = (float)heightmap_y * preterrain.heightmap_conversion.y;
|
|
}
|
|
else if (current_layer.output == layer_output_enum.color || current_layer.output == layer_output_enum.splat)
|
|
{
|
|
layer_x = (float)map_x * preterrain.splatmap_conversion.x;
|
|
layer_y = (float)map_y * preterrain.splatmap_conversion.y;
|
|
}
|
|
else if (current_layer.output == layer_output_enum.grass)
|
|
{
|
|
layer_x = (float)detailmap_x * preterrain.detailmap_conversion.x;
|
|
layer_y = (float)detailmap_y * preterrain.detailmap_conversion.y;
|
|
}
|
|
else
|
|
{
|
|
layer_x = local_x_rot;
|
|
layer_y = local_y_rot;
|
|
}
|
|
for (int j = 0; j < current_layer.prefilter.filter_index.Count; j++)
|
|
{
|
|
calc_filter_value(filter[current_layer.prefilter.filter_index[j]], num5, x);
|
|
}
|
|
layer_output_enum output = current_layer.output;
|
|
if (output == layer_output_enum.tree)
|
|
{
|
|
if (!overlap && !(subfilter_value * current_layer.strength <= 0f))
|
|
{
|
|
if (current_layer.tree_output.tree.Count == 0)
|
|
{
|
|
continue;
|
|
}
|
|
TreeInstance item = default(TreeInstance);
|
|
float num6 = 0f;
|
|
float num7 = default(float);
|
|
float num8 = default(float);
|
|
bool flag2 = true;
|
|
int num9 = Mathf.FloorToInt(current_layer.tree_output.tree_value.curve.Evaluate(filter_value) * (float)current_layer.tree_output.tree.Count);
|
|
if (num9 > current_layer.tree_output.tree.Count - 1)
|
|
{
|
|
num9 = current_layer.tree_output.tree.Count - 1;
|
|
}
|
|
if (num9 < 0)
|
|
{
|
|
num9 = 0;
|
|
}
|
|
tree_class tree_class2 = current_layer.tree_output.tree[num9];
|
|
item.prototypeIndex = tree_class2.prototypeindex;
|
|
if (current_layer.positionSeed)
|
|
{
|
|
if (num5 == 0f || x == 0f)
|
|
{
|
|
UnityEngine.Random.seed = (int)((float)(seed - 10) + (num5 + 1f) * (x + 1f) + 10000000f + (float)i);
|
|
}
|
|
else
|
|
{
|
|
UnityEngine.Random.seed = (int)((float)(seed - 10) + num5 * x + (float)i);
|
|
}
|
|
}
|
|
random_range2 = UnityEngine.Random.value;
|
|
if (!(random_range2 <= subfilter_value * current_layer.strength))
|
|
{
|
|
continue;
|
|
}
|
|
filter_value = 0f;
|
|
for (int k = 0; k < tree_class2.prefilter.filter_index.Count; k++)
|
|
{
|
|
calc_filter_value(filter[tree_class2.prefilter.filter_index[k]], num5, x);
|
|
}
|
|
float num10 = tree_class2.height_end - tree_class2.height_start;
|
|
float num11 = num10 * filter_value;
|
|
float y2 = num11 + tree_class2.height_start;
|
|
float num12 = num11 / num10;
|
|
float num13 = tree_class2.width_end - tree_class2.width_start;
|
|
float num14 = num13 * num12 - tree_class2.unlink * num11 + tree_class2.width_start;
|
|
if (!(num14 >= tree_class2.width_start))
|
|
{
|
|
num14 = tree_class2.width_start;
|
|
}
|
|
float num15 = num13 * num12 + tree_class2.unlink * num11 + tree_class2.width_start;
|
|
if (!(num15 <= tree_class2.width_end))
|
|
{
|
|
num15 = tree_class2.width_end;
|
|
}
|
|
float num16 = UnityEngine.Random.Range(num14, num15);
|
|
scale = new Vector3(num16, y2, num16);
|
|
float num17 = 0f;
|
|
float num18 = 0f;
|
|
if (tree_class2.random_position)
|
|
{
|
|
num17 = UnityEngine.Random.Range((0f - prelayer3.prearea.step.x) / 2f, prelayer.prearea.step.x / 2f);
|
|
num18 = UnityEngine.Random.Range((0f - prelayer3.prearea.step.y) / 2f, prelayer.prearea.step.y / 2f);
|
|
}
|
|
float interpolatedHeight = preterrain.terrain.terrainData.GetInterpolatedHeight((local_x_rot + num17) / preterrain.size.x, (local_y_rot + num18) / preterrain.size.z);
|
|
position = new Vector3(local_x_rot + num17, interpolatedHeight + tree_class2.height, local_y_rot + num18);
|
|
if (tree_class2.distance_level != distance_level_enum.This || tree_class2.min_distance.x != 0f || tree_class2.min_distance.z != 0f || tree_class2.min_distance.y != 0f)
|
|
{
|
|
object_info.position = position + new Vector3(preterrain.rect.x, 0f, preterrain.rect.y);
|
|
object_info.min_distance = tree_class2.min_distance;
|
|
if (tree_class2.distance_include_scale)
|
|
{
|
|
object_info.min_distance = new Vector3(object_info.min_distance.x * scale.x, object_info.min_distance.y * scale.y, object_info.min_distance.z * scale.z);
|
|
}
|
|
if (tree_class2.distance_include_scale_group)
|
|
{
|
|
object_info.min_distance *= current_layer.tree_output.scale;
|
|
}
|
|
object_info.distance_rotation = tree_class2.distance_rotation_mode;
|
|
object_info.distance_mode = tree_class2.distance_mode;
|
|
switch (tree_class2.distance_level)
|
|
{
|
|
case distance_level_enum.This:
|
|
flag2 = check_object_distance(tree_class2.objects_placed);
|
|
break;
|
|
case distance_level_enum.Layer:
|
|
flag2 = check_object_distance(current_layer.objects_placed);
|
|
break;
|
|
case distance_level_enum.LayerLevel:
|
|
flag2 = check_object_distance(prelayer3.objects_placed);
|
|
break;
|
|
case distance_level_enum.Global:
|
|
flag2 = check_object_distance(objects_placed);
|
|
break;
|
|
}
|
|
}
|
|
if (tree_class2.raycast)
|
|
{
|
|
if (tree_class2.raycast_mode == raycast_mode_enum.Hit)
|
|
{
|
|
if (Physics.SphereCast(new Vector3(x + num17 + prelayer.prearea.step.x / 2f, height * preterrain.size.y + tree_class2.cast_height, prelayer.counter_y + num18), tree_class2.ray_radius, tree_class2.ray_direction, out hit, tree_class2.ray_length, tree_class2.layerMask))
|
|
{
|
|
layerHit = (int)Mathf.Pow(2f, hit.transform.gameObject.layer);
|
|
if ((layerHit & tree_class2.layerMask) != 0)
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
else if (Physics.Raycast(new Vector3(x + num17 + prelayer.prearea.step.x / 2f, tree_class2.cast_height, prelayer.counter_y + num18), tree_class2.ray_direction, out hit, tree_class2.ray_length, tree_class2.layerMask))
|
|
{
|
|
layerHit = (int)Mathf.Pow(2f, hit.transform.gameObject.layer);
|
|
if ((layerHit & tree_class2.layerMask) != 0)
|
|
{
|
|
position.y = hit.point.y;
|
|
}
|
|
}
|
|
}
|
|
if (flag2)
|
|
{
|
|
item.position = new Vector3(position.x / preterrain.size.x, position.y / preterrain.size.y, position.z / preterrain.size.z);
|
|
if (tree_class2.precolor_range.color_range.Count != 0)
|
|
{
|
|
int num19 = Mathf.FloorToInt(tree_class2.precolor_range.color_range_value.curve.Evaluate(subfilter_value) * (float)tree_class2.precolor_range.color_range.Count);
|
|
if (num19 > tree_class2.precolor_range.color_range.Count - 1)
|
|
{
|
|
num19 = tree_class2.precolor_range.color_range.Count - 1;
|
|
}
|
|
color_range_class color_range_class2 = tree_class2.precolor_range.color_range[num19];
|
|
tree_color = random_color_from_range(color_range_class2.color_start, color_range_class2.color_end);
|
|
}
|
|
item.color = tree_color;
|
|
item.lightmapColor = tree_color;
|
|
item.heightScale = scale.y * current_layer.tree_output.scale;
|
|
item.widthScale = scale.x * current_layer.tree_output.scale;
|
|
item.rotation = UnityEngine.Random.Range(0f, (float)Math.PI * 2f);
|
|
tree_instances.Add(item);
|
|
tree_class2.placed++;
|
|
prelayer.layer[i].tree_output.placed = prelayer.layer[i].tree_output.placed + 1;
|
|
tree_class2.placed_reference.placed = tree_class2.placed;
|
|
prelayer.layer[i].tree_output.placed_reference.placed = prelayer.layer[i].tree_output.placed;
|
|
if (current_layer.nonOverlap)
|
|
{
|
|
overlap = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if (output == layer_output_enum.grass)
|
|
{
|
|
if (!(subfilter_value * current_layer.strength <= 0f))
|
|
{
|
|
int num20 = default(int);
|
|
int num21 = 0;
|
|
for (num20 = 0; num20 < preterrain.grass.Length; num20++)
|
|
{
|
|
num21 = (int)((float)num21 + preterrain.grass[num20]);
|
|
grass_detail[num20].detail[detailmap_y, detailmap_x] = (int)((float)grass_detail[num20].detail[detailmap_y, detailmap_x] + preterrain.grass[num20] * settings.grass_density);
|
|
if (grass_detail[num20].detail[detailmap_y, detailmap_x] < 0)
|
|
{
|
|
grass_detail[num20].detail[detailmap_y, detailmap_x] = 0;
|
|
}
|
|
else if (grass_detail[num20].detail[detailmap_y, detailmap_x] > 16)
|
|
{
|
|
grass_detail[num20].detail[detailmap_y, detailmap_x] = 16;
|
|
}
|
|
}
|
|
if (current_layer.nonOverlap && num21 > 0)
|
|
{
|
|
overlap = true;
|
|
}
|
|
}
|
|
for (count_value = 0; count_value < preterrain.grass.Length; count_value++)
|
|
{
|
|
preterrain.grass[count_value] = 0f;
|
|
}
|
|
}
|
|
else if (output == layer_output_enum.@object)
|
|
{
|
|
if (!overlap && !(subfilter_value * current_layer.strength * filter_strength <= 0f))
|
|
{
|
|
if (current_layer.object_output.@object.Count == 0)
|
|
{
|
|
continue;
|
|
}
|
|
int num22 = (int)(current_layer.object_output.object_value.curve.Evaluate(filter_value) * (float)current_layer.object_output.@object.Count);
|
|
if (num22 > current_layer.object_output.@object.Count - 1)
|
|
{
|
|
num22 = current_layer.object_output.@object.Count - 1;
|
|
}
|
|
if (num22 < 0)
|
|
{
|
|
num22 = 0;
|
|
}
|
|
object_class2 = current_layer.object_output.@object[num22];
|
|
if (object_class2.place_maximum && object_class2.placed_prelayer >= object_class2.place_max)
|
|
{
|
|
continue;
|
|
}
|
|
if (current_layer.positionSeed)
|
|
{
|
|
if (num5 == 0f || x == 0f)
|
|
{
|
|
UnityEngine.Random.seed = (int)((float)(seed - 10) + (num5 + 1f) * (x + 1f) + 10000000f + (float)i);
|
|
}
|
|
else
|
|
{
|
|
UnityEngine.Random.seed = (int)((float)(seed - 10) + num5 * x + (float)i);
|
|
}
|
|
}
|
|
random_range2 = UnityEngine.Random.Range(0f, 1f);
|
|
if (!(random_range2 <= subfilter_value * current_layer.strength * filter_strength))
|
|
{
|
|
continue;
|
|
}
|
|
bool flag2 = true;
|
|
bool flag3 = true;
|
|
rotation = Quaternion.identity;
|
|
int num23 = default(int);
|
|
position = new Vector3(x, 0f, num5);
|
|
Vector3 position_start = object_class2.position_start;
|
|
Vector3 position_end = object_class2.position_end;
|
|
Vector3 vector2 = new Vector3
|
|
{
|
|
x = UnityEngine.Random.Range(position_start.x, position_end.x),
|
|
y = UnityEngine.Random.Range(position_start.y, position_end.y),
|
|
z = UnityEngine.Random.Range(position_start.z, position_end.z)
|
|
};
|
|
if (object_class2.random_position)
|
|
{
|
|
vector2.x += UnityEngine.Random.Range(0f - prelayer3.prearea.step.x, prelayer3.prearea.step.x);
|
|
vector2.z += UnityEngine.Random.Range(0f - prelayer3.prearea.step.y, prelayer3.prearea.step.y);
|
|
}
|
|
position += vector2;
|
|
if (settings.showTerrains)
|
|
{
|
|
if (!preterrain.prearea.area.Contains(new Vector2(position.x, position.z)))
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
else if (!premesh.area.Contains(new Vector2(position.x, position.z)))
|
|
{
|
|
continue;
|
|
}
|
|
if (object_class2.terrain_rotate)
|
|
{
|
|
Vector3 interpolatedNormal = preterrain.terrain.terrainData.GetInterpolatedNormal((local_x_rot + vector2.x) / preterrain.size.x, (local_y_rot + vector2.y) / preterrain.size.z);
|
|
interpolatedNormal.x = interpolatedNormal.x / 3f * 2f;
|
|
interpolatedNormal.z = interpolatedNormal.z / 3f * 2f;
|
|
rotation = Quaternion.FromToRotation(Vector3.up, interpolatedNormal);
|
|
}
|
|
if (!object_class2.rotation_map.active)
|
|
{
|
|
rotation *= Quaternion.AngleAxis(UnityEngine.Random.Range(object_class2.rotation_start.x, object_class2.rotation_end.x), Vector3.right);
|
|
rotation *= Quaternion.AngleAxis(UnityEngine.Random.Range(object_class2.rotation_start.y, object_class2.rotation_end.y), Vector3.up);
|
|
rotation *= Quaternion.AngleAxis(UnityEngine.Random.Range(object_class2.rotation_start.z, object_class2.rotation_end.z), Vector3.forward);
|
|
rotation *= Quaternion.Euler(object_class2.parent_rotation);
|
|
}
|
|
else
|
|
{
|
|
rotation *= Quaternion.AngleAxis(object_class2.rotation_map.calc_rotation(get_image_pixel(object_class2.rotation_map.preimage, local_x, local_y)), Vector3.up);
|
|
}
|
|
if (object_class2.look_at_parent)
|
|
{
|
|
rotation.y = Quaternion.LookRotation(new Vector3(prelayer3.prearea.area.center.x, 0f, prelayer3.prearea.area.center.y) - position).eulerAngles.y;
|
|
}
|
|
if (object_class2.rotation_steps)
|
|
{
|
|
Vector3 eulerAngles = rotation.eulerAngles;
|
|
if (object_class2.rotation_step.x != 0f)
|
|
{
|
|
eulerAngles.x = Mathf.Round(eulerAngles.x / object_class2.rotation_step.x) * object_class2.rotation_step.x;
|
|
}
|
|
if (object_class2.rotation_step.y != 0f)
|
|
{
|
|
eulerAngles.y = Mathf.Round(eulerAngles.y / object_class2.rotation_step.y) * object_class2.rotation_step.y;
|
|
}
|
|
if (object_class2.rotation_step.z != 0f)
|
|
{
|
|
eulerAngles.z = Mathf.Round(eulerAngles.z / object_class2.rotation_step.z) * object_class2.rotation_step.z;
|
|
}
|
|
rotation.eulerAngles = eulerAngles;
|
|
}
|
|
if (current_layer.object_output.group_rotation)
|
|
{
|
|
int num24 = check_object_rotate(current_layer.object_output.objects_placed, current_layer.object_output.objects_placed_rot, position, (int)current_layer.object_output.min_distance_x_rot, (int)current_layer.object_output.min_distance_z_rot);
|
|
if (num24 != -1)
|
|
{
|
|
rotation.eulerAngles = current_layer.object_output.objects_placed_rot[num24];
|
|
if (current_layer.object_output.group_rotation_steps)
|
|
{
|
|
if (current_layer.object_output.group_rotation_step.x != 0f)
|
|
{
|
|
rotation.x += Mathf.Round(UnityEngine.Random.Range(0f, 360f / current_layer.object_output.group_rotation_step.x)) * current_layer.object_output.group_rotation_step.x;
|
|
}
|
|
if (current_layer.object_output.group_rotation_step.y != 0f)
|
|
{
|
|
rotation.y += Mathf.Round(UnityEngine.Random.Range(0f, 360f / current_layer.object_output.group_rotation_step.y)) * current_layer.object_output.group_rotation_step.y;
|
|
}
|
|
if (current_layer.object_output.group_rotation_step.z != 0f)
|
|
{
|
|
rotation.z += Mathf.Round(UnityEngine.Random.Range(0f, 360f / current_layer.object_output.group_rotation_step.z)) * current_layer.object_output.group_rotation_step.z;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (object_class2.terrain_height)
|
|
{
|
|
if (settings.showTerrains)
|
|
{
|
|
height_interpolated = preterrain.terrain.terrainData.GetInterpolatedHeight((local_x_rot + vector2.x) / preterrain.size.x, (local_y_rot + vector2.z) / preterrain.size.z);
|
|
position.y = height_interpolated + preterrain.terrain.transform.position.y + vector2.y;
|
|
}
|
|
else
|
|
{
|
|
GetMeshHeightSlope(premesh, new Vector2(x + vector2.x, num5 + vector2.z));
|
|
if (!mesh_measure.hit)
|
|
{
|
|
continue;
|
|
}
|
|
height_interpolated = mesh_measure.height;
|
|
degree = mesh_measure.degree;
|
|
position.y = height_interpolated + vector2.y;
|
|
}
|
|
}
|
|
if (!(object_class2.sphereOverlapRadius <= 0f) && Physics.OverlapSphere(new Vector3(position.x, position.y + object_class2.sphereOverlapHeight, position.z), object_class2.sphereOverlapRadius).Length != 0)
|
|
{
|
|
continue;
|
|
}
|
|
position.y -= degree * object_class2.slopeY;
|
|
float num25 = object_class2.scale_end.x - object_class2.scale_start.x;
|
|
scale.x = UnityEngine.Random.Range(object_class2.scale_start.x, object_class2.scale_end.x);
|
|
float num26 = scale.x - object_class2.scale_start.x;
|
|
float num27 = num26 / num25;
|
|
float num28 = object_class2.scale_end.y - object_class2.scale_start.y;
|
|
float num29 = num28 * num27 - object_class2.unlink_y * num26 + object_class2.scale_start.y;
|
|
if (!(num29 >= object_class2.scale_start.y))
|
|
{
|
|
num29 = object_class2.scale_start.y;
|
|
}
|
|
float num30 = num28 * num27 + object_class2.unlink_y * num26 + object_class2.scale_start.y;
|
|
if (!(num30 <= object_class2.scale_end.y))
|
|
{
|
|
num30 = object_class2.scale_end.y;
|
|
}
|
|
scale.y = UnityEngine.Random.Range(num29, num30);
|
|
float num31 = object_class2.scale_end.z - object_class2.scale_start.z;
|
|
float num32 = num31 * num27 - object_class2.unlink_z * num26 + object_class2.scale_start.z;
|
|
if (!(num32 >= object_class2.scale_start.z))
|
|
{
|
|
num32 = object_class2.scale_start.z;
|
|
}
|
|
float num33 = num31 * num27 + object_class2.unlink_z * num26 + object_class2.scale_start.z;
|
|
if (!(num33 <= object_class2.scale_end.z))
|
|
{
|
|
num33 = object_class2.scale_end.z;
|
|
}
|
|
scale.z = UnityEngine.Random.Range(num32, num33);
|
|
if (object_class2.raycast)
|
|
{
|
|
if (object_class2.raycast_mode == raycast_mode_enum.Hit)
|
|
{
|
|
if (Physics.SphereCast(new Vector3(x + prelayer.prearea.step.x / 2f, height * preterrain.size.y + object_class2.cast_height, prelayer.counter_y), object_class2.ray_radius, object_class2.ray_direction, out hit, object_class2.ray_length, object_class2.layerMask))
|
|
{
|
|
layerHit = (int)Mathf.Pow(2f, hit.transform.gameObject.layer);
|
|
if ((layerHit & object_class2.layerMask) != 0)
|
|
{
|
|
continue;
|
|
}
|
|
}
|
|
}
|
|
else if (Physics.Raycast(new Vector3(x + prelayer.prearea.step.x / 2f, object_class2.cast_height, prelayer.counter_y), object_class2.ray_direction, out hit, object_class2.ray_length, object_class2.layerMask))
|
|
{
|
|
layerHit = (int)Mathf.Pow(2f, hit.transform.gameObject.layer);
|
|
if ((layerHit & object_class2.layerMask) != 0)
|
|
{
|
|
position.y = hit.point.y;
|
|
}
|
|
}
|
|
}
|
|
if (object_class2.pivot_center)
|
|
{
|
|
position.y += scale.y / 2f;
|
|
}
|
|
bool flag4 = false;
|
|
if (object_class2.distance_level != distance_level_enum.This || object_class2.min_distance.x != 0f || object_class2.min_distance.z != 0f || object_class2.min_distance.y != 0f)
|
|
{
|
|
flag4 = true;
|
|
object_info.position = position;
|
|
object_info.rotation = rotation.eulerAngles;
|
|
object_info.min_distance = object_class2.min_distance;
|
|
if (object_class2.distance_include_scale)
|
|
{
|
|
object_info.min_distance = new Vector3(object_info.min_distance.x * scale.x, object_info.min_distance.y * scale.y, object_info.min_distance.z * scale.z);
|
|
}
|
|
if (object_class2.distance_include_scale_group)
|
|
{
|
|
object_info.min_distance *= current_layer.object_output.scale;
|
|
}
|
|
if (object_class2.includeScale)
|
|
{
|
|
object_info.min_distance = Vector3.Scale(object_info.min_distance, object_class2.object1.transform.lossyScale);
|
|
}
|
|
object_info.distance_rotation = object_class2.distance_rotation_mode;
|
|
object_info.distance_mode = object_class2.distance_mode;
|
|
switch (object_class2.distance_level)
|
|
{
|
|
case distance_level_enum.This:
|
|
flag2 = check_object_distance(object_class2.objects_placed);
|
|
break;
|
|
case distance_level_enum.Layer:
|
|
flag2 = check_object_distance(current_layer.objects_placed);
|
|
break;
|
|
case distance_level_enum.LayerLevel:
|
|
flag2 = check_object_distance(prelayer3.objects_placed);
|
|
break;
|
|
case distance_level_enum.Global:
|
|
flag2 = check_object_distance(objects_placed);
|
|
break;
|
|
}
|
|
}
|
|
scale *= current_layer.object_output.scale;
|
|
if (object_class2.includeScale)
|
|
{
|
|
scale = Vector3.Scale(scale, object_class2.object1.transform.localScale);
|
|
}
|
|
if (flag2)
|
|
{
|
|
float z = preterrain.size.z;
|
|
z /= preterrain.heightmap_resolution;
|
|
if (current_layer.nonOverlap)
|
|
{
|
|
overlap = true;
|
|
}
|
|
if (!object_class2.objectStream)
|
|
{
|
|
gameObject = null;
|
|
gameObject = UnityEngine.Object.Instantiate(object_class2.object1, position, Quaternion.identity);
|
|
pointsRange.Add(new object_point_class(new Vector2(position.x, position.z), gameObject));
|
|
if (object_class2.lookAtObject != null)
|
|
{
|
|
gameObject.transform.LookAt(object_class2.lookAtObject);
|
|
gameObject.transform.eulerAngles = new Vector3(rotation.eulerAngles.x, gameObject.transform.eulerAngles.y + rotation.eulerAngles.y, rotation.eulerAngles.z);
|
|
}
|
|
else
|
|
{
|
|
gameObject.transform.rotation = rotation;
|
|
}
|
|
gameObject.transform.localScale = scale;
|
|
gameObject.SetActive(false);
|
|
placedObjects.Add(gameObject);
|
|
int num34 = 0;
|
|
if (object_class2.object_material.active)
|
|
{
|
|
num34 = object_class2.object_material.set_material(gameObject, 0);
|
|
}
|
|
if (object_class2.combine)
|
|
{
|
|
if (object_class2.object_material.combine_count[num34] >= object_class2.mesh_combine || (!object_class2.combine_total && object_class2.placed_prelayer == 0))
|
|
{
|
|
object_class2.object_material.combine_count[num34] = 0;
|
|
}
|
|
if (object_class2.object_material.combine_count[num34] == 0)
|
|
{
|
|
string rhs = null;
|
|
if (object_class2.object_material.material.Count > 1)
|
|
{
|
|
rhs = "_mat" + num34;
|
|
}
|
|
object_class2.object_material.combine_parent[num34] = UnityEngine.Object.Instantiate(Combine_Children);
|
|
if (settings.parentObjectsTerrain)
|
|
{
|
|
object_class2.object_material.combine_parent[num34].transform.parent = preterrain.objectParent.transform;
|
|
}
|
|
else
|
|
{
|
|
object_class2.object_material.combine_parent[num34].transform.parent = object_class2.parent;
|
|
}
|
|
if (object_class2.combine_parent_name == string.Empty)
|
|
{
|
|
object_class2.object_material.combine_parent[num34].name = object_class2.object1.name + rhs;
|
|
}
|
|
else
|
|
{
|
|
object_class2.object_material.combine_parent[num34].name = object_class2.combine_parent_name + rhs;
|
|
}
|
|
}
|
|
gameObject.transform.parent = object_class2.object_material.combine_parent[num34].transform;
|
|
}
|
|
else if (settings.parentObjectsTerrain)
|
|
{
|
|
gameObject.transform.parent = preterrain.objectParent.transform;
|
|
}
|
|
else
|
|
{
|
|
gameObject.transform.parent = object_class2.parent;
|
|
}
|
|
object_class2.object_material.combine_count[num34] = object_class2.object_material.combine_count[num34] + 1;
|
|
gameObject.name = object_class2.object1.name + "_" + object_class2.placed;
|
|
}
|
|
if (flag4)
|
|
{
|
|
current_layer.object_output.objects_placed.Add(position);
|
|
if (current_layer.object_output.group_rotation)
|
|
{
|
|
current_layer.object_output.objects_placed_rot.Add(rotation.eulerAngles);
|
|
}
|
|
}
|
|
object_class2.placed++;
|
|
object_class2.placed_prelayer++;
|
|
current_layer.object_output.placed = current_layer.object_output.placed + 1;
|
|
row_object_count++;
|
|
object_class2.placed_reference.placed = object_class2.placed;
|
|
current_layer.object_output.placed_reference.placed = current_layer.object_output.placed;
|
|
object_class2.object2 = gameObject;
|
|
if (object_class2.prelayer_created && prelayers[object_class2.prelayer_index].prearea.active)
|
|
{
|
|
goto IL_2afe;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if (output == layer_output_enum.heightmap && !button_export)
|
|
{
|
|
heights[heightmap_y, heightmap_x] += filter_value * current_layer.strength;
|
|
}
|
|
if (current_layer.output == layer_output_enum.splat)
|
|
{
|
|
for (count_value = 0; count_value < preterrain.splat_length; count_value++)
|
|
{
|
|
preterrain.splat_layer[count_value] = preterrain.splat_layer[count_value] + preterrain.splat[count_value];
|
|
}
|
|
for (count_value = 0; count_value < preterrain.splat.Length; count_value++)
|
|
{
|
|
preterrain.splat[count_value] = 0f;
|
|
}
|
|
}
|
|
if (current_layer.output == layer_output_enum.color)
|
|
{
|
|
for (count_value = 0; count_value < preterrain.color_length; count_value++)
|
|
{
|
|
preterrain.color_layer[count_value] = preterrain.color_layer[count_value] + preterrain.color[count_value];
|
|
}
|
|
for (count_value = 0; count_value < preterrain.color_length; count_value++)
|
|
{
|
|
preterrain.color[count_value] = 0f;
|
|
}
|
|
}
|
|
}
|
|
if (button_export)
|
|
{
|
|
color = default(Color);
|
|
if (color_output)
|
|
{
|
|
for (count_value = 0; count_value < 3; count_value++)
|
|
{
|
|
color[count_value] = preterrain.color_layer[count_value];
|
|
preterrain.color_layer[count_value] = 0f;
|
|
}
|
|
}
|
|
if (splat_output)
|
|
{
|
|
for (count_value = 0; count_value < 3; count_value++)
|
|
{
|
|
color[count_value] = preterrain.splat_layer[count_value];
|
|
preterrain.splat_layer[count_value] = 0f;
|
|
}
|
|
}
|
|
if (heightmap_output)
|
|
{
|
|
convert_16to8_bit(heights[heightmap_y, heightmap_x]);
|
|
color[0] = 0f;
|
|
color[1] = (float)byte_hi * 1f / 255f;
|
|
color[2] = (float)byte_lo * 1f / 255f;
|
|
color[3] = 0f;
|
|
export_bytes[heightmap_x * 2 + heightmap_y * 2049 * 2] = (byte)byte_hi;
|
|
export_bytes[heightmap_x * 2 + 1 + heightmap_y * 2049 * 2] = (byte)byte_lo;
|
|
}
|
|
export_texture.SetPixel(map_x, map_y, color);
|
|
}
|
|
else
|
|
{
|
|
if (splat_output)
|
|
{
|
|
float num35 = default(float);
|
|
int num36 = preterrain.splat_layer.Length / 4;
|
|
num35 = 0f;
|
|
for (count_value = 0; count_value < preterrain.splat_layer.Length; count_value++)
|
|
{
|
|
num35 += preterrain.splat_layer[count_value];
|
|
}
|
|
for (l = 0; l < num36; l++)
|
|
{
|
|
for (count_value = 0; count_value < 4; count_value++)
|
|
{
|
|
color[count_value] = preterrain.splat_layer[l * 4 + count_value] / num35;
|
|
preterrain.splat_layer[l * 4 + count_value] = 0f;
|
|
}
|
|
preterrain.splat_alpha[l].SetPixel(map_x, map_y, color);
|
|
}
|
|
}
|
|
if (color_output)
|
|
{
|
|
if (!settings.direct_colormap)
|
|
{
|
|
color[3] = 0f;
|
|
for (count_value = 0; count_value < 3; count_value++)
|
|
{
|
|
color[count_value] = preterrain.color_layer[count_value];
|
|
preterrain.color_layer[count_value] = 0f;
|
|
}
|
|
preterrain.splat_alpha[l].SetPixel(map_x, map_y, color);
|
|
}
|
|
else
|
|
{
|
|
color[3] = 1f;
|
|
for (count_value = 0; count_value < 3; count_value++)
|
|
{
|
|
color[count_value] = preterrain.color_layer[count_value];
|
|
preterrain.color_layer[count_value] = 0f;
|
|
}
|
|
preterrain.ColorGlobal.SetPixel(map_x, map_y, color);
|
|
}
|
|
}
|
|
}
|
|
if (Time.realtimeSinceStartup - auto_speed_time <= 1f / (float)target_frame)
|
|
{
|
|
continue;
|
|
}
|
|
goto IL_33c9;
|
|
}
|
|
prelayer3.break_x_value = 0f;
|
|
prelayer3.counter_y -= prelayer.prearea.step.y;
|
|
continue;
|
|
}
|
|
prelayer3.y -= (float)(generate_speed + 1) * prelayer.prearea.step.y;
|
|
generate_time = Time.realtimeSinceStartup - generate_time_start;
|
|
generate_error = false;
|
|
result = 1;
|
|
break;
|
|
IL_33c9:
|
|
prelayer3.break_x_value = prelayer3.x - prelayer3.prearea.area.x + prelayer3.prearea.step.x;
|
|
row_object_count = 0;
|
|
break_x = true;
|
|
prelayer3.y = prelayer3.counter_y;
|
|
generate_time = Time.realtimeSinceStartup - generate_time_start;
|
|
generate_error = false;
|
|
result = 4;
|
|
break;
|
|
IL_2afe:
|
|
set_object_child(object_class2, rotation.eulerAngles);
|
|
prelayer3.x += prelayer3.prearea.step.x;
|
|
prelayer3.y = prelayer3.counter_y;
|
|
if (!(prelayer3.x > prelayer.prearea.area.xMax))
|
|
{
|
|
prelayer3.break_x_value = prelayer3.x - prelayer3.prearea.area.x;
|
|
}
|
|
else
|
|
{
|
|
prelayer3.y -= prelayer3.prearea.step.y;
|
|
prelayer3.break_x_value = 0f;
|
|
}
|
|
prelayer_stack.Add(object_class2.prelayer_index);
|
|
prelayer = prelayers[object_class2.prelayer_index];
|
|
prelayer.prearea.area.x = position.x + prelayer.prearea.area_old.x * scale.x;
|
|
prelayer.prearea.area.y = position.z + prelayer.prearea.area_old.y * scale.z;
|
|
prelayer.prearea.area.width = prelayer.prearea.area_old.width * scale.x;
|
|
prelayer.prearea.area.height = prelayer.prearea.area_old.height * scale.z;
|
|
if (rotation.y != 0f)
|
|
{
|
|
prelayer.prearea.rotation = rotation.eulerAngles;
|
|
prelayer.prearea.rotation_active = true;
|
|
}
|
|
prelayer.prearea.step.y = Mathf.Sqrt(Mathf.Pow(prelayer.prearea.step_old.x, 2f) + Mathf.Pow(prelayer.prearea.step_old.y, 2f)) / 2f;
|
|
prelayer.prearea.step.x = prelayer.prearea.step.y;
|
|
prelayer.prearea.center = new Vector2(position.x, position.z);
|
|
prelayer.y = prelayer.prearea.area.yMax;
|
|
generate_error = false;
|
|
result = 3;
|
|
break;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual void set_object_child(object_class @object, Vector3 rotation)
|
|
{
|
|
for (int i = 0; i < @object.object_child.Count; i++)
|
|
{
|
|
@object.object_child[i].parent_rotation = rotation;
|
|
if (!@object.object_child[i].place_maximum_total)
|
|
{
|
|
@object.object_child[i].placed_prelayer = 0;
|
|
}
|
|
if (!@object.object_child[i].parent || @object.object_child[i].parent_set)
|
|
{
|
|
@object.object_child[i].parent = @object.object2.transform;
|
|
@object.object_child[i].parent_set = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void create_object_child_list(object_class @object)
|
|
{
|
|
if (!@object.prelayer_created)
|
|
{
|
|
return;
|
|
}
|
|
for (int i = 0; i < prelayers[@object.prelayer_index].layer.Count; i++)
|
|
{
|
|
if (prelayers[@object.prelayer_index].layer[i].output == layer_output_enum.@object)
|
|
{
|
|
for (int j = 0; j < prelayers[@object.prelayer_index].layer[i].object_output.@object.Count; j++)
|
|
{
|
|
@object.object_child.Add(prelayers[@object.prelayer_index].layer[i].object_output.@object[j]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void calc_filter_value(filter_class filter, float counter_y, float x)
|
|
{
|
|
float num = default(float);
|
|
float num2 = default(float);
|
|
Color color = default(Color);
|
|
Color color2 = default(Color);
|
|
filter_input = 0f;
|
|
filter_strength = filter.strength;
|
|
bool flag = false;
|
|
if (filter.device == filter_devices_enum.Standard)
|
|
{
|
|
switch (filter.type)
|
|
{
|
|
case condition_type_enum.Height:
|
|
filter_input = height;
|
|
break;
|
|
case condition_type_enum.Current:
|
|
if (filter.change_mode == change_mode_enum.filter)
|
|
{
|
|
filter_input = filter_value;
|
|
}
|
|
else if (current_layer.output == layer_output_enum.heightmap)
|
|
{
|
|
filter_input = filter_value + heights[heightmap_y, heightmap_x];
|
|
}
|
|
break;
|
|
case condition_type_enum.Always:
|
|
filter_input = filter.curve_position;
|
|
break;
|
|
case condition_type_enum.Steepness:
|
|
filter_input = degree / 90f;
|
|
break;
|
|
case condition_type_enum.Direction:
|
|
{
|
|
float num3 = default(float);
|
|
float num4 = default(float);
|
|
float num5 = default(float);
|
|
num3 = ((normal.x < 0f) ? filter.precurve_x_left.curve.Evaluate(normal.x) : filter.precurve_x_right.curve.Evaluate(normal.x));
|
|
num5 = ((normal.z < 0f) ? filter.precurve_z_left.curve.Evaluate(normal.z) : filter.precurve_z_right.curve.Evaluate(normal.z));
|
|
num4 = filter.precurve_y.curve.Evaluate(normal.y);
|
|
float num6 = num3 + num4 + num5;
|
|
filter_input = num6;
|
|
break;
|
|
}
|
|
case condition_type_enum.Image:
|
|
color2 = calc_image_value(filter.preimage, layer_x, layer_y);
|
|
if (filter.preimage.splatmap)
|
|
{
|
|
flag = true;
|
|
if (!filter.preimage.includeAlpha)
|
|
{
|
|
color2.a = 0f;
|
|
}
|
|
}
|
|
if (filter.preimage.output)
|
|
{
|
|
filter_input = filter.preimage.output_pos;
|
|
}
|
|
break;
|
|
case condition_type_enum.RawHeightmap:
|
|
calc_raw_value(filter.raw, layer_x, layer_y);
|
|
filter_input = filter.raw.output_pos;
|
|
break;
|
|
case condition_type_enum.Random:
|
|
filter_input = UnityEngine.Random.Range(0f, 1f);
|
|
break;
|
|
case condition_type_enum.RandomRange:
|
|
if (!(random_range <= filter.range_start) && !(random_range >= filter.range_end))
|
|
{
|
|
filter_input = UnityEngine.Random.Range(0f, 1f);
|
|
}
|
|
break;
|
|
case condition_type_enum.Splatmap:
|
|
if (splat_output)
|
|
{
|
|
filter_input = preterrain.splat_layer[filter.splat_index];
|
|
if (!(filter_input >= filter.curve_position))
|
|
{
|
|
filter_input = 0f;
|
|
}
|
|
}
|
|
else if (filter.splatmap < preterrain.splat_alpha.Length)
|
|
{
|
|
this.color = preterrain.splat_alpha[filter.splatmap].GetPixel(map_x, map_y);
|
|
filter_input = this.color[filter.splat_index - filter.splatmap * 4];
|
|
if (!(filter_input >= filter.curve_position))
|
|
{
|
|
filter_input = 0f;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
filter_input = 1f;
|
|
}
|
|
break;
|
|
case condition_type_enum.RayCast:
|
|
if (filter.raycast_mode == raycast_mode_enum.Hit)
|
|
{
|
|
if (Physics.SphereCast(new Vector3(x + prelayer.prearea.step.x / 2f, height * preterrain.size.y + filter.cast_height, prelayer.counter_y), prelayer.prearea.step.x / 2f * filter.ray_radius, filter.ray_direction, out hit, filter.ray_length, filter.layerMask))
|
|
{
|
|
layerHit = (int)Mathf.Pow(2f, hit.transform.gameObject.layer);
|
|
if ((layerHit & filter.layerMask) != 0)
|
|
{
|
|
filter_input = 0f;
|
|
}
|
|
else
|
|
{
|
|
filter_input = 1f;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
filter_input = 1f;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (filter.raycast_mode != raycast_mode_enum.Height)
|
|
{
|
|
break;
|
|
}
|
|
if (Physics.Raycast(new Vector3(x + prelayer.prearea.step.x / 2f, filter.cast_height, prelayer.counter_y), filter.ray_direction, out hit, filter.ray_length, filter.layerMask))
|
|
{
|
|
layerHit = (int)Mathf.Pow(2f, hit.transform.gameObject.layer);
|
|
if ((layerHit & filter.layerMask) != 0)
|
|
{
|
|
filter_input = hit.point.y / preterrain.terrain.terrainData.size.y;
|
|
}
|
|
else
|
|
{
|
|
filter_strength = 0f;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
filter_strength = 0f;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
else if (filter.device == filter_devices_enum.Math)
|
|
{
|
|
device2_type_enum type = filter.type2;
|
|
if (type == device2_type_enum.Sin)
|
|
{
|
|
filter_input = Mathf.Sin(x * 1f / 20f);
|
|
}
|
|
else if (type == device2_type_enum.Sin)
|
|
{
|
|
filter_input = Mathf.Cos(x * 1f / 20f);
|
|
}
|
|
}
|
|
for (int i = 0; i < filter.precurve_list.Count; i++)
|
|
{
|
|
switch (filter.precurve_list[i].type)
|
|
{
|
|
case curve_type_enum.Normal:
|
|
filter_input = filter.precurve_list[i].curve.Evaluate(filter_input);
|
|
break;
|
|
case curve_type_enum.Random:
|
|
num = filter.precurve_list[i].curve.Evaluate(filter_input);
|
|
if (!filter.precurve_list[i].abs)
|
|
{
|
|
filter_input += UnityEngine.Random.Range(0f - num, num);
|
|
}
|
|
else
|
|
{
|
|
filter_input += UnityEngine.Random.Range(0f, num);
|
|
}
|
|
break;
|
|
case curve_type_enum.Perlin:
|
|
{
|
|
Vector2 vector = default(Vector2);
|
|
vector = ((!filter.precurve_list[i].rotation) ? new Vector2(x, counter_y) : calc_rotation_pixel(x, counter_y, 0f, 0f, 0f - filter.precurve_list[i].rotation_value));
|
|
num2 = filter.precurve_list[i].curve.Evaluate(filter_input);
|
|
num = perlin_noise(vector.x, vector.y, filter.precurve_list[i].offset.x, filter.precurve_list[i].offset.y, filter.precurve_list[i].frequency, filter.precurve_list[i].detail, filter.precurve_list[i].detail_strength) * num2 * filter.precurve_list[i].strength;
|
|
if (!filter.precurve_list[i].abs)
|
|
{
|
|
filter_input += num * 2f - num2;
|
|
}
|
|
else
|
|
{
|
|
filter_input += num;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (filter.presubfilter.subfilter_index.Count > 0)
|
|
{
|
|
if (filter.sub_strength_set)
|
|
{
|
|
subfilter_value = 0f;
|
|
}
|
|
else
|
|
{
|
|
subfilter_value = 1f;
|
|
}
|
|
for (int j = 0; j < filter.presubfilter.subfilter_index.Count; j++)
|
|
{
|
|
current_subfilter = subfilter[filter.presubfilter.subfilter_index[j]];
|
|
calc_subfilter_value(filter, current_subfilter, counter_y, x);
|
|
}
|
|
if (filter.last_value_declared)
|
|
{
|
|
int num7 = (int)((x - prelayer.prearea.area.xMin) / prelayer.prearea.step.x);
|
|
filter.last_value_y[num7] = filter_input;
|
|
filter.last_pos_x = num7;
|
|
filter.last_value_x[0] = filter_input;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
subfilter_value = 1f;
|
|
}
|
|
float num8 = 0f;
|
|
if (!filter.combine)
|
|
{
|
|
filter_input += filter_combine;
|
|
filter_combine = 0f;
|
|
filter_combine_start = 0f;
|
|
}
|
|
else if (filter_combine_start != 0f)
|
|
{
|
|
filter_combine_start = filter_value;
|
|
}
|
|
if (current_layer.output == layer_output_enum.splat && (filter.type != condition_type_enum.Image || !filter.preimage.edge_blur))
|
|
{
|
|
for (count_value = 0; count_value < preterrain.splat.Length; count_value++)
|
|
{
|
|
preterrain.splat_calc[count_value] = 0f;
|
|
}
|
|
for (count_value = 0; count_value < current_layer.splat_output.splat.Count; count_value++)
|
|
{
|
|
if (current_layer.splat_output.splat_custom[count_value].custom)
|
|
{
|
|
for (int k = 0; k < preterrain.splat.Length; k++)
|
|
{
|
|
preterrain.splat_calc[k] = preterrain.splat_calc[k] + current_layer.splat_output.curves[count_value].curve.Evaluate(current_layer.splat_output.splat_value.curve.Evaluate(filter_input)) * (current_layer.splat_output.splat_custom[count_value].value[k] / current_layer.splat_output.splat_custom[count_value].totalValue);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
int num9 = current_layer.splat_output.splat[count_value];
|
|
float num10 = (preterrain.splat_calc[num9] = preterrain.splat_calc[num9] + current_layer.splat_output.curves[count_value].curve.Evaluate(current_layer.splat_output.splat_value.curve.Evaluate(filter_input)));
|
|
}
|
|
}
|
|
}
|
|
if (current_layer.output == layer_output_enum.color)
|
|
{
|
|
if (filter.type == condition_type_enum.Image && filter.preimage.rgb)
|
|
{
|
|
color = color2;
|
|
}
|
|
else
|
|
{
|
|
color[0] = current_layer.color_output.precolor_range[filter.color_output_index].curve_red.Evaluate(current_layer.color_output.precolor_range[filter.color_output_index].color_range_value.curve.Evaluate(filter_input));
|
|
color[1] = current_layer.color_output.precolor_range[filter.color_output_index].curve_green.Evaluate(current_layer.color_output.precolor_range[filter.color_output_index].color_range_value.curve.Evaluate(filter_input));
|
|
color[2] = current_layer.color_output.precolor_range[filter.color_output_index].curve_blue.Evaluate(current_layer.color_output.precolor_range[filter.color_output_index].color_range_value.curve.Evaluate(filter_input));
|
|
color[3] = 0f;
|
|
}
|
|
if (export_color_advanced)
|
|
{
|
|
color *= export_color;
|
|
if (export_color_curve_advanced)
|
|
{
|
|
color[0] = export_color_curve_red.Evaluate(color[0]);
|
|
color[1] = export_color_curve_green.Evaluate(color[1]);
|
|
color[2] = export_color_curve_blue.Evaluate(color[2]);
|
|
}
|
|
else
|
|
{
|
|
color[0] = export_color_curve.Evaluate(color[0]);
|
|
color[1] = export_color_curve.Evaluate(color[1]);
|
|
color[2] = export_color_curve.Evaluate(color[2]);
|
|
}
|
|
}
|
|
}
|
|
else if (current_layer.output == layer_output_enum.grass)
|
|
{
|
|
for (count_value = 0; count_value < current_layer.grass_output.grass_calc.Count; count_value++)
|
|
{
|
|
current_layer.grass_output.grass_calc[count_value] = current_layer.grass_output.curves[count_value].curve.Evaluate(current_layer.grass_output.grass_value.curve.Evaluate(filter_input));
|
|
}
|
|
}
|
|
switch (filter.output)
|
|
{
|
|
case condition_output_enum.add:
|
|
if (current_layer.output == layer_output_enum.heightmap)
|
|
{
|
|
filter_value += filter_input * filter_strength * subfilter_value;
|
|
}
|
|
else
|
|
{
|
|
filter_value += filter_input;
|
|
}
|
|
if (filter.combine)
|
|
{
|
|
filter_combine = filter_value - filter_combine_start;
|
|
break;
|
|
}
|
|
if (current_layer.output == layer_output_enum.color)
|
|
{
|
|
for (count_value = 0; count_value < 3; count_value++)
|
|
{
|
|
preterrain.color[count_value] = preterrain.color[count_value] + color[count_value] * (current_layer.strength * filter_strength * subfilter_value);
|
|
}
|
|
}
|
|
if (current_layer.output == layer_output_enum.splat)
|
|
{
|
|
if (!flag)
|
|
{
|
|
for (count_value = 0; count_value < preterrain.splat.Length; count_value++)
|
|
{
|
|
preterrain.splat[count_value] = preterrain.splat[count_value] + preterrain.splat_calc[count_value] * (current_layer.strength * filter_strength * subfilter_value);
|
|
}
|
|
break;
|
|
}
|
|
count_value = 0;
|
|
while (count_value < 4 && count_value <= preterrain.splat.Length - 1)
|
|
{
|
|
int num15 = current_layer.splat_output.splat[count_value];
|
|
float num16 = (preterrain.splat[num15] = preterrain.splat[num15] + color2[count_value] * (current_layer.strength * filter_strength * subfilter_value));
|
|
count_value++;
|
|
}
|
|
}
|
|
else if (current_layer.output == layer_output_enum.grass)
|
|
{
|
|
for (count_value = 0; count_value < current_layer.grass_output.grass.Count; count_value++)
|
|
{
|
|
preterrain.grass[current_layer.grass_output.grass[count_value].prototypeindex] = preterrain.grass[current_layer.grass_output.grass[count_value].prototypeindex] + current_layer.grass_output.grass_calc[count_value] * (current_layer.strength * subfilter_value);
|
|
}
|
|
}
|
|
break;
|
|
case condition_output_enum.subtract:
|
|
if (current_layer.output == layer_output_enum.heightmap)
|
|
{
|
|
filter_value -= filter_input * filter_strength * subfilter_value;
|
|
}
|
|
else
|
|
{
|
|
filter_value -= filter_input;
|
|
}
|
|
if (filter.combine)
|
|
{
|
|
filter_combine = filter_value - filter_combine_start;
|
|
break;
|
|
}
|
|
if (current_layer.output == layer_output_enum.color)
|
|
{
|
|
for (count_value = 0; count_value < 3; count_value++)
|
|
{
|
|
preterrain.color[count_value] = preterrain.color[count_value] - color[count_value] * (current_layer.strength * filter_strength * subfilter_value);
|
|
}
|
|
}
|
|
if (current_layer.output == layer_output_enum.splat)
|
|
{
|
|
if (!flag)
|
|
{
|
|
for (count_value = 0; count_value < preterrain.splat.Length; count_value++)
|
|
{
|
|
preterrain.splat[count_value] = preterrain.splat[count_value] - preterrain.splat_calc[count_value] * (current_layer.strength * filter_strength * subfilter_value);
|
|
}
|
|
break;
|
|
}
|
|
count_value = 0;
|
|
while (count_value < 4 && count_value <= preterrain.splat.Length - 1)
|
|
{
|
|
int num19 = current_layer.splat_output.splat[count_value];
|
|
float num20 = (preterrain.splat[num19] = preterrain.splat[num19] - color2[count_value] * (current_layer.strength * filter_strength * subfilter_value));
|
|
count_value++;
|
|
}
|
|
}
|
|
else if (current_layer.output == layer_output_enum.grass)
|
|
{
|
|
for (count_value = 0; count_value < current_layer.grass_output.grass.Count; count_value++)
|
|
{
|
|
preterrain.grass[current_layer.grass_output.grass[count_value].prototypeindex] = preterrain.grass[current_layer.grass_output.grass[count_value].prototypeindex] - current_layer.grass_output.grass_calc[count_value] * (current_layer.strength * subfilter_value);
|
|
}
|
|
}
|
|
break;
|
|
case condition_output_enum.change:
|
|
if (current_layer.output == layer_output_enum.heightmap)
|
|
{
|
|
if (filter.change_mode == change_mode_enum.filter)
|
|
{
|
|
filter_value = filter_value * (1f - subfilter_value * filter_strength) + filter_input * (subfilter_value * filter_strength);
|
|
}
|
|
else
|
|
{
|
|
if (filter.combine)
|
|
{
|
|
filter_combine = filter_value - filter_combine_start;
|
|
break;
|
|
}
|
|
heights[heightmap_y, heightmap_x] = (heights[heightmap_y, heightmap_x] + filter_value) * (1f - subfilter_value * filter_strength) + filter_input * (subfilter_value * filter_strength);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
filter_value = filter_value * (1f - subfilter_value) + filter_input * subfilter_value;
|
|
}
|
|
if (filter.combine)
|
|
{
|
|
filter_combine = filter_value - filter_combine_start;
|
|
break;
|
|
}
|
|
if (current_layer.output == layer_output_enum.color)
|
|
{
|
|
if (filter.type == condition_type_enum.Current)
|
|
{
|
|
if (filter.change_mode == change_mode_enum.filter)
|
|
{
|
|
for (count_value = 0; count_value < 3; count_value++)
|
|
{
|
|
preterrain.color[count_value] = preterrain.color[count_value] - preterrain.color[count_value] * (1f - subfilter_value) * current_layer.strength * filter_strength;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (count_value = 0; count_value < 3; count_value++)
|
|
{
|
|
preterrain.color_layer[count_value] = preterrain.color_layer[count_value] - preterrain.color_layer[count_value] * (1f - subfilter_value) * current_layer.strength * filter_strength;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (count_value = 0; count_value < 3; count_value++)
|
|
{
|
|
preterrain.color_layer[count_value] = preterrain.color_layer[count_value] * (1f - subfilter_value * filter_strength * current_layer.strength) + color[count_value] * subfilter_value * filter_strength * current_layer.strength;
|
|
}
|
|
}
|
|
}
|
|
if (current_layer.output != layer_output_enum.splat)
|
|
{
|
|
break;
|
|
}
|
|
if (filter.type == condition_type_enum.Current)
|
|
{
|
|
if (filter.change_mode == change_mode_enum.filter)
|
|
{
|
|
for (count_value = 0; count_value < preterrain.splat.Length; count_value++)
|
|
{
|
|
preterrain.splat[count_value] = preterrain.splat[count_value] - preterrain.splat[count_value] * (1f - subfilter_value) * current_layer.strength * filter_strength;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (count_value = 0; count_value < preterrain.splat.Length; count_value++)
|
|
{
|
|
preterrain.splat_layer[count_value] = preterrain.splat_layer[count_value] - preterrain.splat_layer[count_value] * (1f - subfilter_value) * current_layer.strength * filter_strength;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
if (filter.change_mode == change_mode_enum.filter)
|
|
{
|
|
if (!flag)
|
|
{
|
|
for (count_value = 0; count_value < preterrain.splat.Length; count_value++)
|
|
{
|
|
preterrain.splat[count_value] = preterrain.splat[count_value] * (1f - filter_strength * current_layer.strength * subfilter_value) + preterrain.splat_calc[count_value] * subfilter_value * filter_strength * current_layer.strength;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
count_value = 0;
|
|
while (count_value < 4 && count_value <= preterrain.splat.Length - 1)
|
|
{
|
|
preterrain.splat[current_layer.splat_output.splat[count_value]] = preterrain.splat[current_layer.splat_output.splat[count_value]] * (1f - filter_strength * current_layer.strength * subfilter_value) + color2[count_value] * (current_layer.strength * filter_strength * subfilter_value);
|
|
count_value++;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
for (count_value = 0; count_value < preterrain.splat.Length; count_value++)
|
|
{
|
|
preterrain.splat_layer[count_value] = preterrain.splat_layer[count_value] * (1f - filter_strength * current_layer.strength * subfilter_value);
|
|
}
|
|
if (!flag)
|
|
{
|
|
for (count_value = 0; count_value < preterrain.splat.Length; count_value++)
|
|
{
|
|
preterrain.splat[count_value] = preterrain.splat[count_value] + preterrain.splat_calc[count_value] * subfilter_value * filter_strength * current_layer.strength;
|
|
}
|
|
break;
|
|
}
|
|
count_value = 0;
|
|
while (count_value < 4 && count_value <= preterrain.splat.Length - 1)
|
|
{
|
|
int num23 = current_layer.splat_output.splat[count_value];
|
|
float num24 = (preterrain.splat[num23] = preterrain.splat[num23] + color2[count_value] * (current_layer.strength * filter_strength * subfilter_value));
|
|
count_value++;
|
|
}
|
|
break;
|
|
case condition_output_enum.multiply:
|
|
if (current_layer.output == layer_output_enum.heightmap)
|
|
{
|
|
filter_value *= filter_input * filter_strength * subfilter_value;
|
|
}
|
|
else
|
|
{
|
|
filter_value *= filter_input;
|
|
}
|
|
if (filter.combine)
|
|
{
|
|
filter_combine = filter_value - filter_combine_start;
|
|
break;
|
|
}
|
|
if (current_layer.output == layer_output_enum.color)
|
|
{
|
|
for (count_value = 0; count_value < current_layer.splat_output.splat.Count; count_value++)
|
|
{
|
|
preterrain.color[count_value] = preterrain.color[count_value] * (color[count_value] * (current_layer.strength * filter_strength * subfilter_value));
|
|
}
|
|
}
|
|
if (current_layer.output == layer_output_enum.splat)
|
|
{
|
|
if (!flag)
|
|
{
|
|
for (count_value = 0; count_value < preterrain.splat.Length; count_value++)
|
|
{
|
|
preterrain.splat[count_value] = preterrain.splat[count_value] * (preterrain.splat_calc[count_value] * (current_layer.strength * filter_strength * subfilter_value));
|
|
}
|
|
break;
|
|
}
|
|
count_value = 0;
|
|
while (count_value < 4 && count_value <= preterrain.splat.Length - 1)
|
|
{
|
|
int num13 = current_layer.splat_output.splat[count_value];
|
|
float num14 = (preterrain.splat[num13] = preterrain.splat[num13] * (color2[count_value] * (current_layer.strength * filter_strength * subfilter_value)));
|
|
count_value++;
|
|
}
|
|
}
|
|
else if (current_layer.output == layer_output_enum.grass)
|
|
{
|
|
for (count_value = 0; count_value < current_layer.grass_output.grass.Count; count_value++)
|
|
{
|
|
preterrain.grass[current_layer.grass_output.grass[count_value].prototypeindex] = preterrain.grass[current_layer.grass_output.grass[count_value].prototypeindex] * (current_layer.grass_output.grass_calc[count_value] * (current_layer.strength * subfilter_value));
|
|
}
|
|
}
|
|
break;
|
|
case condition_output_enum.divide:
|
|
if (current_layer.output == layer_output_enum.heightmap)
|
|
{
|
|
if (filter_input * filter_strength * subfilter_value != 0f)
|
|
{
|
|
filter_value /= filter_input * filter_strength * subfilter_value;
|
|
}
|
|
}
|
|
else if (filter_input != 0f)
|
|
{
|
|
filter_value /= filter_input;
|
|
}
|
|
if (filter.combine)
|
|
{
|
|
filter_combine = filter_value - filter_combine_start;
|
|
break;
|
|
}
|
|
if (current_layer.output == layer_output_enum.color)
|
|
{
|
|
for (count_value = 0; count_value < 3; count_value++)
|
|
{
|
|
if (color[count_value] * (current_layer.strength * filter_strength * subfilter_value) != 0f)
|
|
{
|
|
preterrain.color[count_value] = preterrain.color[count_value] / (color[count_value] * (current_layer.strength * filter_strength * subfilter_value));
|
|
}
|
|
}
|
|
}
|
|
if (current_layer.output == layer_output_enum.splat)
|
|
{
|
|
if (!flag)
|
|
{
|
|
for (count_value = 0; count_value < preterrain.splat.Length; count_value++)
|
|
{
|
|
if (preterrain.splat_calc[count_value] * (current_layer.strength * filter_strength * subfilter_value) != 0f)
|
|
{
|
|
preterrain.splat[count_value] = preterrain.splat[count_value] / (preterrain.splat_calc[count_value] * (current_layer.strength * filter_strength * subfilter_value));
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
count_value = 0;
|
|
while (count_value < 4 && count_value <= preterrain.splat.Length - 1)
|
|
{
|
|
if (color2[count_value] * (current_layer.strength * filter_strength * subfilter_value) != 0f)
|
|
{
|
|
int num21 = current_layer.splat_output.splat[count_value];
|
|
float num22 = (preterrain.splat[num21] = preterrain.splat[num21] / (color2[count_value] * (current_layer.strength * filter_strength * subfilter_value)));
|
|
}
|
|
count_value++;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (current_layer.output != layer_output_enum.grass)
|
|
{
|
|
break;
|
|
}
|
|
for (count_value = 0; count_value < current_layer.grass_output.grass.Count; count_value++)
|
|
{
|
|
if (current_layer.grass_output.grass_calc[current_layer.grass_output.grass[count_value].prototypeindex] * (current_layer.strength * subfilter_value) != 0f)
|
|
{
|
|
preterrain.grass[count_value] = preterrain.grass[count_value] / current_layer.grass_output.grass_calc[count_value] * (current_layer.strength * subfilter_value);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
case condition_output_enum.average:
|
|
if (current_layer.output == layer_output_enum.heightmap)
|
|
{
|
|
filter_value += filter_input * filter_strength * subfilter_value / (float)current_layer.prefilter.filter_index.Count;
|
|
}
|
|
else
|
|
{
|
|
filter_value += filter_input / (float)current_layer.prefilter.filter_index.Count;
|
|
}
|
|
if (filter.combine)
|
|
{
|
|
filter_combine = filter_value - filter_combine_start;
|
|
break;
|
|
}
|
|
if (current_layer.output == layer_output_enum.color)
|
|
{
|
|
for (count_value = 0; count_value < 3; count_value++)
|
|
{
|
|
preterrain.color[count_value] = preterrain.color[count_value] + color[0] * (current_layer.strength * filter_strength * subfilter_value) / (float)current_layer.prefilter.filter_index.Count;
|
|
}
|
|
}
|
|
if (current_layer.output == layer_output_enum.splat)
|
|
{
|
|
if (!flag)
|
|
{
|
|
for (count_value = 0; count_value < preterrain.splat.Length; count_value++)
|
|
{
|
|
preterrain.splat[count_value] = preterrain.splat[count_value] + preterrain.splat_calc[count_value] * (current_layer.strength * filter_strength * subfilter_value) / (float)current_layer.prefilter.filter_index.Count;
|
|
}
|
|
break;
|
|
}
|
|
count_value = 0;
|
|
while (count_value < 4 && count_value <= preterrain.splat.Length - 1)
|
|
{
|
|
int num11 = current_layer.splat_output.splat[count_value];
|
|
float num12 = (preterrain.splat[num11] = preterrain.splat[num11] + color2[count_value] * (current_layer.strength * filter_strength * subfilter_value) / (float)current_layer.prefilter.filter_index.Count);
|
|
count_value++;
|
|
}
|
|
}
|
|
else if (current_layer.output == layer_output_enum.grass)
|
|
{
|
|
for (count_value = 0; count_value < current_layer.grass_output.grass.Count; count_value++)
|
|
{
|
|
preterrain.grass[current_layer.grass_output.grass[count_value].prototypeindex] = preterrain.grass[current_layer.grass_output.grass[count_value].prototypeindex] + current_layer.grass_output.grass_calc[count_value] * (current_layer.strength * subfilter_value) / (float)current_layer.prefilter.filter_index.Count;
|
|
}
|
|
}
|
|
break;
|
|
case condition_output_enum.difference:
|
|
if (current_layer.output == layer_output_enum.heightmap)
|
|
{
|
|
filter_value = Mathf.Abs(filter_value - filter_input * filter_strength * subfilter_value);
|
|
}
|
|
else
|
|
{
|
|
filter_value = Mathf.Abs(filter_value - filter_input);
|
|
}
|
|
if (filter.combine)
|
|
{
|
|
filter_combine = filter_value - filter_combine_start;
|
|
break;
|
|
}
|
|
if (current_layer.output == layer_output_enum.color)
|
|
{
|
|
for (count_value = 0; count_value < 3; count_value++)
|
|
{
|
|
preterrain.color[count_value] = Mathf.Abs(preterrain.color[count_value] - color[0] * (current_layer.strength * filter_strength * subfilter_value));
|
|
}
|
|
}
|
|
if (current_layer.output == layer_output_enum.splat)
|
|
{
|
|
if (!flag)
|
|
{
|
|
for (count_value = 0; count_value < preterrain.splat.Length; count_value++)
|
|
{
|
|
preterrain.splat[count_value] = Mathf.Abs(preterrain.splat[count_value] - preterrain.splat_calc[count_value] * (current_layer.strength * filter_strength * subfilter_value));
|
|
}
|
|
break;
|
|
}
|
|
count_value = 0;
|
|
while (count_value < 4 && count_value <= preterrain.splat.Length - 1)
|
|
{
|
|
int num17 = current_layer.splat_output.splat[count_value];
|
|
float num18 = (preterrain.splat[num17] = preterrain.splat[num17] + Mathf.Abs(preterrain.splat[count_value] - color2[count_value] * (current_layer.strength * filter_strength * subfilter_value)));
|
|
count_value++;
|
|
}
|
|
}
|
|
else if (current_layer.output == layer_output_enum.grass)
|
|
{
|
|
for (count_value = 0; count_value < current_layer.grass_output.grass.Count; count_value++)
|
|
{
|
|
preterrain.grass[current_layer.grass_output.grass[count_value].prototypeindex] = Mathf.Abs(preterrain.grass[count_value] - current_layer.grass_output.grass_calc[count_value] * (current_layer.strength * subfilter_value));
|
|
}
|
|
}
|
|
break;
|
|
case condition_output_enum.max:
|
|
if (filter_input * filter_strength * subfilter_value <= filter_value)
|
|
{
|
|
break;
|
|
}
|
|
if (current_layer.output == layer_output_enum.heightmap)
|
|
{
|
|
filter_value = filter_input * filter_strength * subfilter_value;
|
|
}
|
|
if (filter.combine)
|
|
{
|
|
filter_combine = filter_value - filter_combine_start;
|
|
break;
|
|
}
|
|
if (current_layer.output == layer_output_enum.color)
|
|
{
|
|
for (count_value = 0; count_value < 3; count_value++)
|
|
{
|
|
preterrain.color[count_value] = color[count_value] * (current_layer.strength * filter_strength * subfilter_value);
|
|
}
|
|
}
|
|
if (current_layer.output == layer_output_enum.splat)
|
|
{
|
|
if (!flag)
|
|
{
|
|
for (count_value = 0; count_value < preterrain.splat.Length; count_value++)
|
|
{
|
|
preterrain.splat[count_value] = preterrain.splat_calc[count_value] * (current_layer.strength * filter_strength * subfilter_value);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
count_value = 0;
|
|
while (count_value < 4 && count_value <= preterrain.splat.Length - 1)
|
|
{
|
|
preterrain.splat[current_layer.splat_output.splat[count_value]] = color2[count_value] * (current_layer.strength * filter_strength * subfilter_value);
|
|
count_value++;
|
|
}
|
|
}
|
|
}
|
|
if (current_layer.output == layer_output_enum.grass)
|
|
{
|
|
for (count_value = 0; count_value < current_layer.grass_output.grass.Count; count_value++)
|
|
{
|
|
preterrain.grass[current_layer.grass_output.grass[count_value].prototypeindex] = current_layer.grass_output.grass_calc[count_value] * (current_layer.strength * subfilter_value);
|
|
}
|
|
}
|
|
break;
|
|
case condition_output_enum.min:
|
|
if (filter_input * filter_strength * subfilter_value >= filter_value)
|
|
{
|
|
break;
|
|
}
|
|
if (current_layer.output == layer_output_enum.heightmap)
|
|
{
|
|
filter_value = filter_input * filter_strength * subfilter_value;
|
|
}
|
|
else
|
|
{
|
|
filter_value = filter_input;
|
|
}
|
|
if (filter.combine)
|
|
{
|
|
filter_combine = filter_value - filter_combine_start;
|
|
break;
|
|
}
|
|
if (current_layer.output == layer_output_enum.color)
|
|
{
|
|
for (count_value = 0; count_value < 3; count_value++)
|
|
{
|
|
preterrain.color[count_value] = color[count_value] * (current_layer.strength * filter_strength * subfilter_value);
|
|
}
|
|
}
|
|
if (current_layer.output == layer_output_enum.splat)
|
|
{
|
|
if (!flag)
|
|
{
|
|
for (count_value = 0; count_value < preterrain.splat.Length; count_value++)
|
|
{
|
|
preterrain.splat[count_value] = preterrain.splat_calc[count_value] * (current_layer.strength * filter_strength * subfilter_value);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
count_value = 0;
|
|
while (count_value < 4 && count_value <= preterrain.splat.Length - 1)
|
|
{
|
|
preterrain.splat[current_layer.splat_output.splat[count_value]] = color2[count_value] * (current_layer.strength * filter_strength * subfilter_value);
|
|
count_value++;
|
|
}
|
|
}
|
|
}
|
|
else if (current_layer.output == layer_output_enum.grass)
|
|
{
|
|
for (count_value = 0; count_value < current_layer.grass_output.grass.Count; count_value++)
|
|
{
|
|
preterrain.grass[current_layer.grass_output.grass[count_value].prototypeindex] = current_layer.grass_output.grass_calc[count_value] * (current_layer.strength * subfilter_value);
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
public virtual void calc_subfilter_value(filter_class filter, subfilter_class subfilter, float counter_y, float x)
|
|
{
|
|
float num = 0f;
|
|
float num2 = UnityEngine.Random.Range(0f, 1f);
|
|
float num3 = default(float);
|
|
float num4 = default(float);
|
|
int num5 = default(int);
|
|
switch (subfilter.type)
|
|
{
|
|
case condition_type_enum.RandomRange:
|
|
if (!(random_range < subfilter.range_start) && !(random_range > subfilter.range_end))
|
|
{
|
|
num = num2;
|
|
subfilter.range_count++;
|
|
}
|
|
break;
|
|
case condition_type_enum.Random:
|
|
num = num2;
|
|
break;
|
|
case condition_type_enum.Height:
|
|
num = height;
|
|
break;
|
|
case condition_type_enum.Steepness:
|
|
num = degree / 90f;
|
|
break;
|
|
case condition_type_enum.Always:
|
|
num = subfilter.curve_position;
|
|
break;
|
|
case condition_type_enum.Image:
|
|
color = calc_image_value(subfilter.preimage, layer_x, layer_y);
|
|
if (!subfilter.preimage.output)
|
|
{
|
|
break;
|
|
}
|
|
num = subfilter.preimage.output_pos;
|
|
if (current_layer.output != layer_output_enum.tree || !subfilter.from_tree)
|
|
{
|
|
break;
|
|
}
|
|
tree_color[0] = color[0] * subfilter.strength;
|
|
tree_color[1] = color[1] * subfilter.strength;
|
|
tree_color[2] = color[2] * subfilter.strength;
|
|
for (num5 = 0; num5 < subfilter.precurve_list.Count; num5++)
|
|
{
|
|
if (subfilter.precurve_list[num5].type == curve_type_enum.Normal)
|
|
{
|
|
tree_color[0] = subfilter.precurve_list[num5].curve.Evaluate(tree_color[0]);
|
|
tree_color[1] = subfilter.precurve_list[num5].curve.Evaluate(tree_color[1]);
|
|
tree_color[2] = subfilter.precurve_list[num5].curve.Evaluate(tree_color[2]);
|
|
}
|
|
}
|
|
break;
|
|
case condition_type_enum.RawHeightmap:
|
|
calc_raw_value(subfilter.raw, layer_x, layer_y);
|
|
num = subfilter.raw.output_pos;
|
|
break;
|
|
case condition_type_enum.MaxCount:
|
|
if (subfilter.output_count >= subfilter.output_max)
|
|
{
|
|
subfilter_value = 0f;
|
|
return;
|
|
}
|
|
if (!(subfilter_value < subfilter.output_count_min))
|
|
{
|
|
subfilter.output_count++;
|
|
}
|
|
break;
|
|
case condition_type_enum.Splatmap:
|
|
if (splat_output)
|
|
{
|
|
num = preterrain.splat_layer[subfilter.splat_index];
|
|
if (!(num >= subfilter.curve_position))
|
|
{
|
|
num = 0f;
|
|
}
|
|
}
|
|
else if (subfilter.splatmap < preterrain.splat_alpha.Length)
|
|
{
|
|
color = preterrain.splat_alpha[subfilter.splatmap].GetPixel(map_x, map_y);
|
|
num = color[subfilter.splat_index - subfilter.splatmap * 4];
|
|
if (!(num >= subfilter.curve_position))
|
|
{
|
|
num = 0f;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
num = 1f;
|
|
}
|
|
break;
|
|
case condition_type_enum.RayCast:
|
|
if (subfilter.raycast_mode == raycast_mode_enum.Hit)
|
|
{
|
|
if (Physics.SphereCast(new Vector3(x + prelayer.prearea.step.x / 2f, height * preterrain.size.y + subfilter.cast_height, prelayer.counter_y), prelayer.prearea.step.x / 2f * subfilter.ray_radius, subfilter.ray_direction, out hit, subfilter.ray_length, subfilter.layerMask))
|
|
{
|
|
layerHit = (int)Mathf.Pow(2f, hit.transform.gameObject.layer);
|
|
num = (((layerHit & subfilter.layerMask) == 0) ? 1f : 0f);
|
|
}
|
|
else
|
|
{
|
|
num = 1f;
|
|
}
|
|
}
|
|
else if (subfilter.raycast_mode == raycast_mode_enum.Height)
|
|
{
|
|
if (Physics.Raycast(new Vector3(x + prelayer.prearea.step.x / 2f, subfilter.cast_height, prelayer.counter_y), subfilter.ray_direction, out hit, subfilter.ray_length, subfilter.layerMask))
|
|
{
|
|
layerHit = (int)Mathf.Pow(2f, hit.transform.gameObject.layer);
|
|
num = (((layerHit & subfilter.layerMask) == 0) ? 0f : (hit.point.y / preterrain.terrain.terrainData.size.y));
|
|
}
|
|
else
|
|
{
|
|
num = 0f;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
for (num5 = 0; num5 < subfilter.precurve_list.Count; num5++)
|
|
{
|
|
switch (subfilter.precurve_list[num5].type)
|
|
{
|
|
case curve_type_enum.Normal:
|
|
num = subfilter.precurve_list[num5].curve.Evaluate(num);
|
|
break;
|
|
case curve_type_enum.Random:
|
|
num3 = subfilter.precurve_list[num5].curve.Evaluate(num);
|
|
num = (subfilter.precurve_list[num5].abs ? (num + UnityEngine.Random.Range(0f, num3)) : (num + UnityEngine.Random.Range(0f - num3, num3)));
|
|
break;
|
|
case curve_type_enum.Perlin:
|
|
{
|
|
Vector2 vector = default(Vector2);
|
|
vector = ((!subfilter.precurve_list[num5].rotation) ? new Vector2(x, counter_y) : calc_rotation_pixel(x, counter_y, 0f, 0f, 0f - subfilter.precurve_list[num5].rotation_value));
|
|
num4 = subfilter.precurve_list[num5].curve.Evaluate(num);
|
|
num3 = perlin_noise(vector.x, vector.y, subfilter.precurve_list[num5].offset.x, subfilter.precurve_list[num5].offset.y, subfilter.precurve_list[num5].frequency, subfilter.precurve_list[num5].detail, subfilter.precurve_list[num5].detail_strength) * num4 * subfilter.precurve_list[num5].strength;
|
|
num = (subfilter.precurve_list[num5].abs ? (num + num3) : (num + (num3 * 2f - num4)));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (subfilter.mode != subfilter_mode_enum.strength)
|
|
{
|
|
float num6 = filter_input;
|
|
float num7 = filter_input;
|
|
int num8 = (int)((x - prelayer.prearea.area.xMin) / prelayer.prearea.step.x);
|
|
if (!(Mathf.Abs((float)num8 - filter.last_pos_x) > prelayer.prearea.step.x))
|
|
{
|
|
if (subfilter.mode == subfilter_mode_enum.smooth)
|
|
{
|
|
num6 = Mathf.SmoothStep(filter.last_value_x[0], num6, 1f - num) * subfilter.strength;
|
|
}
|
|
if (subfilter.mode == subfilter_mode_enum.lerp)
|
|
{
|
|
num6 = Mathf.Lerp(filter.last_value_x[0], num6, 1f - num) * subfilter.strength;
|
|
}
|
|
}
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if (terrains[i].rect.Contains(new Vector2(Mathf.Round(x / preterrain.heightmap_conversion.x) * preterrain.heightmap_conversion.x, counter_y + preterrain.heightmap_conversion.y)) && i == preterrain.index)
|
|
{
|
|
if (subfilter.mode == subfilter_mode_enum.smooth)
|
|
{
|
|
num7 = Mathf.SmoothStep(filter.last_value_y[num8], num7, 1f - num) * subfilter.strength;
|
|
}
|
|
else if (subfilter.mode == subfilter_mode_enum.lerp)
|
|
{
|
|
num7 = Mathf.Lerp(filter.last_value_y[num8], num7, 1f - num) * subfilter.strength;
|
|
}
|
|
}
|
|
}
|
|
filter_input = (num6 + num7) / 2f;
|
|
return;
|
|
}
|
|
switch (subfilter.output)
|
|
{
|
|
case subfilter_output_enum.add:
|
|
subfilter_value += num * subfilter.strength;
|
|
break;
|
|
case subfilter_output_enum.subtract:
|
|
subfilter_value -= num * subfilter.strength;
|
|
break;
|
|
case subfilter_output_enum.min:
|
|
if (!(num * subfilter.strength >= subfilter_value))
|
|
{
|
|
subfilter_value = num * subfilter.strength + subfilter_value * (1f - subfilter.strength);
|
|
}
|
|
break;
|
|
case subfilter_output_enum.max:
|
|
if (!(num * subfilter.strength <= subfilter_value))
|
|
{
|
|
subfilter_value = num * subfilter.strength + subfilter_value * (1f - subfilter.strength);
|
|
}
|
|
break;
|
|
case subfilter_output_enum.average:
|
|
subfilter_value += num * subfilter.strength / (float)filter.presubfilter.subfilter_index.Count;
|
|
break;
|
|
}
|
|
}
|
|
|
|
public virtual void getRawTerrainTile(raw_class raw)
|
|
{
|
|
if (raw.flipTotalY)
|
|
{
|
|
raw.raw_number = (int)(preterrain.tiles.x * preterrain.tiles.y - (float)(preterrain.index_old + 1));
|
|
if (!raw.flipTotalX)
|
|
{
|
|
int num = (int)(Mathf.Floor((float)raw.raw_number / preterrain.tiles.x) * preterrain.tiles.x);
|
|
raw.raw_number = (int)((float)(num + num) + preterrain.tiles.x - (float)(raw.raw_number + 1));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
raw.raw_number = preterrain.index_old;
|
|
if (raw.flipTotalX)
|
|
{
|
|
int num = (int)(Mathf.Floor((float)raw.raw_number / preterrain.tiles.x) * preterrain.tiles.x);
|
|
raw.raw_number = (int)((float)(num + num) + preterrain.tiles.x - (float)(raw.raw_number + 1));
|
|
}
|
|
}
|
|
if (raw.raw_number > raw.file_index.Count - 1)
|
|
{
|
|
raw.raw_number = 0;
|
|
}
|
|
}
|
|
|
|
public virtual float Fraq(float v)
|
|
{
|
|
return v - Mathf.Floor(v);
|
|
}
|
|
|
|
public virtual void calc_raw_value(raw_class raw, float local_x, float local_y)
|
|
{
|
|
if (raw.raw_list_mode == list_condition_enum.Terrain)
|
|
{
|
|
getRawTerrainTile(raw);
|
|
}
|
|
if (raw.raw_number > raw.file_index.Count - 1)
|
|
{
|
|
raw.raw_number = 0;
|
|
}
|
|
Vector2 vector = default(Vector2);
|
|
Vector2 vector2 = default(Vector2);
|
|
Vector2 vector3 = default(Vector2);
|
|
float num = 0f;
|
|
float num2 = 0f;
|
|
float num3 = 1f;
|
|
float num4 = 1f;
|
|
raw_file_class raw_file_class2 = raw_files[raw.file_index[raw.raw_number]];
|
|
if (raw.flip_x)
|
|
{
|
|
num3 = -1f;
|
|
num = raw_files[raw.file_index[raw.raw_number]].resolution.x - 1f;
|
|
}
|
|
if (!raw.flip_y)
|
|
{
|
|
num4 = -1f;
|
|
num2 = raw_files[raw.file_index[raw.raw_number]].resolution.y - 1f;
|
|
}
|
|
if (raw.raw_mode == image_mode_enum.MultiTerrain)
|
|
{
|
|
if (settings.showMeshes)
|
|
{
|
|
vector.x = Mathf.Round(((raw_files[raw.file_index[raw.raw_number]].resolution.x - 1f) / meshes_area.area.width * (prelayer.x - meshes_area.area.xMin) * num3 - raw.tile_offset_x + num) / raw.tile_x);
|
|
vector.y = Mathf.Round(((raw_files[raw.file_index[raw.raw_number]].resolution.y - 1f) / meshes_area.area.height * (prelayer.counter_y - meshes_area.area.yMin) * num4 - raw.tile_offset_y + num2) / raw.tile_y);
|
|
}
|
|
else
|
|
{
|
|
float num5 = default(float);
|
|
float num6 = default(float);
|
|
num5 = (raw_files[raw.file_index[raw.raw_number]].resolution.x - 1f) / preterrain.tiles.x * preterrain.tile_x;
|
|
num6 = (raw_files[raw.file_index[raw.raw_number]].resolution.y - 1f) / preterrain.tiles.y * preterrain.tile_z;
|
|
vector.x = Mathf.Round(((local_x / raw.conversion_step.x + num5) * num3 - raw.tile_offset_x + num) / raw.tile_x);
|
|
vector.y = Mathf.Round(((local_y / raw.conversion_step.y + num6) * num4 - raw.tile_offset_y + num2) / raw.tile_y);
|
|
}
|
|
}
|
|
else if (raw.raw_mode == image_mode_enum.Terrain)
|
|
{
|
|
if (settings.showMeshes)
|
|
{
|
|
vector.x = Mathf.Round(((raw_files[raw.file_index[raw.raw_number]].resolution.x - 1f) / premesh.area.width * (prelayer.x - premesh.area.xMin) * num3 - raw.tile_offset_x + num) / raw.tile_x);
|
|
vector.y = Mathf.Round(((raw_files[raw.file_index[raw.raw_number]].resolution.y - 1f) / premesh.area.height * (prelayer.counter_y - premesh.area.yMin) * num4 - raw.tile_offset_y + num2) / raw.tile_y);
|
|
}
|
|
else
|
|
{
|
|
vector.x = (local_x / raw.conversion_step.x * num3 - raw.tile_offset_x + num) / raw.tile_x;
|
|
vector.y = (local_y / raw.conversion_step.y * num4 - raw.tile_offset_y + num2) / raw.tile_y;
|
|
}
|
|
}
|
|
else if (settings.showMeshes)
|
|
{
|
|
vector.x = Mathf.Round(((raw_files[raw.file_index[raw.raw_number]].resolution.x - 1f) / premesh.area.width * (prelayer.x - premesh.area.xMin) * num3 - raw.tile_offset_x + num) / raw.tile_x);
|
|
vector.y = Mathf.Round(((raw_files[raw.file_index[raw.raw_number]].resolution.y - 1f) / premesh.area.height * (prelayer.counter_y - premesh.area.yMin) * num4 - raw.tile_offset_y + num2) / raw.tile_y);
|
|
}
|
|
else
|
|
{
|
|
vector.x = ((local_x - prelayer.prearea.area_old.x) / raw.conversion_step.x * num3 - raw.tile_offset_x + num) / raw.tile_x;
|
|
vector.y = ((local_y - prelayer.prearea.area_old.y) / raw.conversion_step.y * num4 - raw.tile_offset_y + num2) / raw.tile_y;
|
|
}
|
|
if (raw.rotation)
|
|
{
|
|
vector = calc_rotation_pixel(vector.x, vector.y, raw_files[raw.file_index[raw.raw_number]].resolution.x / 2f / raw.conversion_step.x, raw_files[raw.file_index[raw.raw_number]].resolution.y / 2f / raw.conversion_step.y, raw.rotation_value);
|
|
}
|
|
vector2.x = Mathf.Floor(vector.x);
|
|
vector2.y = Mathf.Floor(vector.y);
|
|
vector3.x = Mathf.Ceil(vector.x);
|
|
vector3.y = Mathf.Ceil(vector.y);
|
|
float num7 = vector.x - vector2.x;
|
|
float num8 = vector.y - vector2.y;
|
|
if (raw.clamp)
|
|
{
|
|
if (vector2.x < 0f || !(vector2.x < raw_file_class2.resolution.x))
|
|
{
|
|
raw.output_pos = 0f;
|
|
return;
|
|
}
|
|
if (vector2.y < 0f || !(vector2.y < raw_file_class2.resolution.y))
|
|
{
|
|
raw.output_pos = 0f;
|
|
return;
|
|
}
|
|
if (vector3.x < 0f || !(vector3.x < raw_file_class2.resolution.x))
|
|
{
|
|
raw.output_pos = 0f;
|
|
return;
|
|
}
|
|
if (vector3.y < 0f || !(vector3.y < raw_file_class2.resolution.y))
|
|
{
|
|
raw.output_pos = 0f;
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
vector2 = new Vector2(Mathf.Round(Fraq(vector2.x / raw_file_class2.resolution.x) * raw_file_class2.resolution.x), Mathf.Round(Fraq(vector2.y / raw_file_class2.resolution.y) * raw_file_class2.resolution.y));
|
|
vector3 = new Vector2(Mathf.Round(Fraq(vector3.x / raw_file_class2.resolution.x) * raw_file_class2.resolution.x), Mathf.Round(Fraq(vector3.y / raw_file_class2.resolution.y) * raw_file_class2.resolution.y));
|
|
}
|
|
int num9 = (int)(vector2.y * raw_files[raw.file_index[raw.raw_number]].resolution.x * 2f + vector2.x * 2f);
|
|
int num10 = (int)(vector2.y * raw_files[raw.file_index[raw.raw_number]].resolution.x * 2f + vector3.x * 2f);
|
|
int num11 = (int)(vector3.y * raw_files[raw.file_index[raw.raw_number]].resolution.x * 2f + vector2.x * 2f);
|
|
int num12 = (int)(vector3.y * raw_files[raw.file_index[raw.raw_number]].resolution.x * 2f + vector3.x * 2f);
|
|
if (num9 > raw_files[raw.file_index[raw.raw_number]].bytes.Length - 1)
|
|
{
|
|
Debug.Log("The Raw Heightmap file '" + raw_files[raw.file_index[raw.raw_number]].file + "' has a lower resolution than selected. Please check the File size. It should be X*Y*2 = " + raw_files[raw.file_index[raw.raw_number]].resolution.x + "*" + raw_files[raw.file_index[raw.raw_number]].resolution.y + "*2 = " + raw_files[raw.file_index[raw.raw_number]].resolution.x * raw_files[raw.file_index[raw.raw_number]].resolution.y * 2f + " Bytes (" + raw_files[raw.file_index[raw.raw_number]].resolution.x + "*" + raw_files[raw.file_index[raw.raw_number]].resolution.y + " resolution). But the File size is " + raw_files[raw.file_index[raw.raw_number]].bytes.Length + " Bytes (" + Mathf.Round(Mathf.Sqrt(raw_files[raw.file_index[raw.raw_number]].bytes.Length / 2)) + "x" + Mathf.Round(Mathf.Sqrt(raw_files[raw.file_index[raw.raw_number]].bytes.Length / 2)) + " resolution).");
|
|
prelayer.x = 1E+12f;
|
|
prelayer.counter_y = -1E+11f;
|
|
generate = false;
|
|
return;
|
|
}
|
|
float num13 = default(float);
|
|
float num14 = default(float);
|
|
float num15 = default(float);
|
|
float num16 = default(float);
|
|
if (raw_files[raw.file_index[raw.raw_number]].mode == raw_mode_enum.Mac)
|
|
{
|
|
num13 = ((float)(int)raw_files[raw.file_index[raw.raw_number]].bytes[num9] * 256f + (float)(int)raw_files[raw.file_index[raw.raw_number]].bytes[num9 + 1]) / 65535f;
|
|
num14 = ((float)(int)raw_files[raw.file_index[raw.raw_number]].bytes[num10] * 256f + (float)(int)raw_files[raw.file_index[raw.raw_number]].bytes[num10 + 1]) / 65535f;
|
|
num15 = ((float)(int)raw_files[raw.file_index[raw.raw_number]].bytes[num11] * 256f + (float)(int)raw_files[raw.file_index[raw.raw_number]].bytes[num11 + 1]) / 65535f;
|
|
num16 = ((float)(int)raw_files[raw.file_index[raw.raw_number]].bytes[num12] * 256f + (float)(int)raw_files[raw.file_index[raw.raw_number]].bytes[num12 + 1]) / 65535f;
|
|
}
|
|
else if (raw_files[raw.file_index[raw.raw_number]].mode == raw_mode_enum.Windows)
|
|
{
|
|
num13 = ((float)(int)raw_files[raw.file_index[raw.raw_number]].bytes[num9] + (float)(int)raw_files[raw.file_index[raw.raw_number]].bytes[num9 + 1] * 256f) / 65535f;
|
|
num14 = ((float)(int)raw_files[raw.file_index[raw.raw_number]].bytes[num10] + (float)(int)raw_files[raw.file_index[raw.raw_number]].bytes[num10 + 1] * 256f) / 65535f;
|
|
num15 = ((float)(int)raw_files[raw.file_index[raw.raw_number]].bytes[num11] + (float)(int)raw_files[raw.file_index[raw.raw_number]].bytes[num11 + 1] * 256f) / 65535f;
|
|
num16 = ((float)(int)raw_files[raw.file_index[raw.raw_number]].bytes[num12] + (float)(int)raw_files[raw.file_index[raw.raw_number]].bytes[num12 + 1] * 256f) / 65535f;
|
|
}
|
|
float num17 = num13 + (num14 - num13) * num7;
|
|
float num18 = num15 + (num16 - num15) * num7;
|
|
raw.output_pos = num17 + (num18 - num17) * num8;
|
|
}
|
|
|
|
public virtual void generate_filter(filter_class filter)
|
|
{
|
|
layer_class layer_class2 = new layer_class();
|
|
Rect area = terrains[0].prearea.area;
|
|
Vector2 vector = new Vector2(area.width / 128f, area.height / 128f);
|
|
Color color = new Color(1f, 1f, 1f, 1f);
|
|
current_layer = layer_class2;
|
|
current_layer.output = layer_output_enum.heightmap;
|
|
for (float num = area.yMin; num < area.yMax; num += vector.y)
|
|
{
|
|
for (float num2 = area.xMin; num2 < area.xMax; num2 += vector.x)
|
|
{
|
|
filter_value = 0f;
|
|
calc_filter_value(filter, num, num2);
|
|
color[0] = filter_value;
|
|
color[1] = filter_value;
|
|
color[2] = filter_value;
|
|
filter.preview_texture.SetPixel((int)(num2 / vector.x), (int)(num / vector.y), color);
|
|
}
|
|
}
|
|
filter.preview_texture.Apply();
|
|
}
|
|
|
|
public virtual void set_image_terrain_mode(int terrain_index)
|
|
{
|
|
for (int i = 0; i < filter.Count; i++)
|
|
{
|
|
if (filter[i].type == condition_type_enum.Image && filter[i].preimage.image_list_mode == list_condition_enum.Terrain && !filter[i].preimage.short_list)
|
|
{
|
|
filter[i].preimage.image_number = terrains[terrain_index].index_old;
|
|
if (filter[i].preimage.image_number > filter[i].preimage.image.Count - 1)
|
|
{
|
|
filter[i].preimage.image_number = filter[i].preimage.image.Count - 1;
|
|
}
|
|
}
|
|
}
|
|
for (int j = 0; j < subfilter.Count; j++)
|
|
{
|
|
if (subfilter[j].type == condition_type_enum.Image && subfilter[j].preimage.image_list_mode == list_condition_enum.Terrain && !subfilter[j].preimage.short_list)
|
|
{
|
|
subfilter[j].preimage.image_number = terrains[terrain_index].index_old;
|
|
if (subfilter[j].preimage.image_number > subfilter[j].preimage.image.Count - 1)
|
|
{
|
|
subfilter[j].preimage.image_number = subfilter[j].preimage.image.Count - 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual Color get_image_pixel(image_class preimage, float local_x, float local_y)
|
|
{
|
|
Color result;
|
|
if (!preimage.image[preimage.image_number])
|
|
{
|
|
result = new Color(0f, 0f, 0f);
|
|
}
|
|
else
|
|
{
|
|
float num = 0f;
|
|
float num2 = 0f;
|
|
float num3 = 1f;
|
|
float num4 = 1f;
|
|
Color color = default(Color);
|
|
local_x -= prelayer.prearea.image_offset.x;
|
|
local_y -= prelayer.prearea.image_offset.y;
|
|
if (preimage.flip_x)
|
|
{
|
|
num3 = -1f;
|
|
num = preimage.image[preimage.image_number].width - 1;
|
|
}
|
|
if (preimage.flip_y)
|
|
{
|
|
num4 = -1f;
|
|
num2 = preimage.image[preimage.image_number].height - 1;
|
|
}
|
|
if (preimage.image_mode == image_mode_enum.Terrain)
|
|
{
|
|
if (settings.showMeshes)
|
|
{
|
|
imagePosition.x = Mathf.Round(((float)preimage.image[preimage.image_number].width / premesh.area.width * (prelayer.x - premesh.area.xMin) * num3 - preimage.tile_offset_x + num) / preimage.tile_x);
|
|
imagePosition.y = Mathf.Round(((float)preimage.image[preimage.image_number].height / premesh.area.height * (prelayer.counter_y - premesh.area.yMin) * num4 - preimage.tile_offset_y + num2) / preimage.tile_y);
|
|
}
|
|
else
|
|
{
|
|
imagePosition.x = Mathf.Round((local_x / preimage.conversion_step.x * num3 - preimage.tile_offset_x + num) / preimage.tile_x);
|
|
imagePosition.y = Mathf.Round((local_y / preimage.conversion_step.y * num4 - preimage.tile_offset_y + num2) / preimage.tile_y);
|
|
}
|
|
}
|
|
else if (preimage.image_mode == image_mode_enum.MultiTerrain)
|
|
{
|
|
if (settings.showMeshes)
|
|
{
|
|
imagePosition.x = Mathf.Round(((float)preimage.image[preimage.image_number].width / meshes_area.area.width * (prelayer.x - meshes_area.area.xMin) * num3 - preimage.tile_offset_x + num) / preimage.tile_x);
|
|
imagePosition.y = Mathf.Round(((float)preimage.image[preimage.image_number].height / meshes_area.area.height * (prelayer.counter_y - meshes_area.area.yMin) * num4 - preimage.tile_offset_y + num2) / preimage.tile_y);
|
|
}
|
|
else
|
|
{
|
|
float num5 = default(float);
|
|
float num6 = default(float);
|
|
num5 = (float)preimage.image[preimage.image_number].width / preterrain.tiles.x * preterrain.tile_x;
|
|
num6 = (float)preimage.image[preimage.image_number].height / preterrain.tiles.y * preterrain.tile_z;
|
|
imagePosition.x = Mathf.Round(((local_x / preimage.conversion_step.x + num5) * num3 - preimage.tile_offset_x + num) / preimage.tile_x);
|
|
imagePosition.y = Mathf.Round(((local_y / preimage.conversion_step.y + num6) * num4 - preimage.tile_offset_y + num2) / preimage.tile_y);
|
|
}
|
|
}
|
|
else if (settings.showMeshes)
|
|
{
|
|
imagePosition.x = Mathf.Round(((float)preimage.image[preimage.image_number].width / premesh.area.width * (prelayer.x - premesh.area.xMin) * num3 - preimage.tile_offset_x + num) / preimage.tile_x);
|
|
imagePosition.y = Mathf.Round(((float)preimage.image[preimage.image_number].height / premesh.area.height * (prelayer.counter_y - premesh.area.yMin) * num4 - preimage.tile_offset_y + num2) / preimage.tile_y);
|
|
}
|
|
else
|
|
{
|
|
imagePosition.x = ((local_x - prelayer.prearea.area_old.x) / preimage.conversion_step.x * num3 - preimage.tile_offset_x + num) / preimage.tile_x;
|
|
imagePosition.y = ((local_y - prelayer.prearea.area_old.y) / preimage.conversion_step.y * num4 - preimage.tile_offset_y + num2) / preimage.tile_y;
|
|
}
|
|
if (preimage.rotation)
|
|
{
|
|
imagePosition = calc_rotation_pixel(imagePosition.x, imagePosition.y, (float)(preimage.image[preimage.image_number].width / 2) / preimage.conversion_step.x, (float)(preimage.image[preimage.image_number].height / 2) / preimage.conversion_step.y, preimage.rotation_value);
|
|
}
|
|
bool flag = true;
|
|
color = ((!preimage.clamp) ? preimage.image[preimage.image_number].GetPixel((int)imagePosition.x, (int)imagePosition.y) : ((!(imagePosition.x > (float)preimage.image[preimage.image_number].width) && !(imagePosition.x < 0f) && !(imagePosition.y > (float)preimage.image[preimage.image_number].height) && imagePosition.y >= 0f) ? preimage.image[preimage.image_number].GetPixel((int)imagePosition.x, (int)imagePosition.y) : Color.black));
|
|
color *= preimage.image_color;
|
|
result = color;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual Color calc_image_value(image_class preimage, float local_x, float local_y)
|
|
{
|
|
Color color = get_image_pixel(preimage, local_x, local_y);
|
|
float output_pos = default(float);
|
|
preimage.output = true;
|
|
preimage.output_pos = color[0];
|
|
if (!preimage.edge_blur || current_layer.output != layer_output_enum.splat)
|
|
{
|
|
if (preimage.precolor_range.color_range.Count > 0)
|
|
{
|
|
preimage.output = false;
|
|
for (count_color_range = 0; count_color_range < preimage.precolor_range.color_range.Count; count_color_range++)
|
|
{
|
|
Color color_start = preimage.precolor_range.color_range[count_color_range].color_start;
|
|
Color color_end = preimage.precolor_range.color_range[count_color_range].color_end;
|
|
if (preimage.select_mode == select_mode_enum.free)
|
|
{
|
|
output_pos = preimage.precolor_range.color_range[count_color_range].output;
|
|
}
|
|
else
|
|
{
|
|
switch (current_layer.output)
|
|
{
|
|
case layer_output_enum.color:
|
|
output_pos = current_layer.color_output.precolor_range[0].color_range_value.select_value[preimage.precolor_range.color_range[count_color_range].select_output];
|
|
break;
|
|
case layer_output_enum.splat:
|
|
if (current_layer.splat_output.splat.Count > 0)
|
|
{
|
|
output_pos = current_layer.splat_output.splat_value.select_value[preimage.precolor_range.color_range[count_color_range].select_output];
|
|
}
|
|
break;
|
|
case layer_output_enum.tree:
|
|
output_pos = current_layer.tree_output.tree_value.select_value[preimage.precolor_range.color_range[count_color_range].select_output];
|
|
break;
|
|
case layer_output_enum.grass:
|
|
output_pos = current_layer.grass_output.grass_value.select_value[preimage.precolor_range.color_range[count_color_range].select_output];
|
|
break;
|
|
case layer_output_enum.@object:
|
|
output_pos = current_layer.object_output.object_value.select_value[preimage.precolor_range.color_range[count_color_range].select_output];
|
|
break;
|
|
}
|
|
}
|
|
if (preimage.precolor_range.color_range[count_color_range].one_color)
|
|
{
|
|
if (preimage.precolor_range.color_range[count_color_range].color_start == color && !preimage.precolor_range.color_range[count_color_range].invert)
|
|
{
|
|
preimage.output_pos = output_pos;
|
|
preimage.output = true;
|
|
}
|
|
else if (preimage.precolor_range.color_range[count_color_range].invert)
|
|
{
|
|
preimage.output_pos = output_pos;
|
|
preimage.output = true;
|
|
}
|
|
}
|
|
else if (color_in_range(color, color_start, color_end))
|
|
{
|
|
if (!preimage.precolor_range.color_range[count_color_range].invert)
|
|
{
|
|
if (preimage.select_mode == select_mode_enum.free)
|
|
{
|
|
preimage.output_pos = preimage.precolor_range.color_range[count_color_range].curve.Evaluate(calc_color_pos(color, color_start, color_end));
|
|
}
|
|
else
|
|
{
|
|
preimage.output_pos = output_pos;
|
|
preimage.output_alpha = calc_color_pos(color, color_start, color_end);
|
|
filter_strength = calc_color_pos(color, color_start, color_end);
|
|
}
|
|
preimage.output = true;
|
|
}
|
|
}
|
|
else if (preimage.precolor_range.color_range[count_color_range].invert)
|
|
{
|
|
if (preimage.select_mode == select_mode_enum.free)
|
|
{
|
|
preimage.output_pos = 1f - preimage.precolor_range.color_range[count_color_range].curve.Evaluate(calc_color_pos(color, color_start, color_end));
|
|
preimage.output = true;
|
|
}
|
|
else
|
|
{
|
|
preimage.output_pos = output_pos;
|
|
preimage.output_alpha = calc_color_pos(color, color_start, color_end);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
float num = default(float);
|
|
float edge_blur_radius = preimage.edge_blur_radius;
|
|
float num2 = edge_blur_radius * 2f + 1f;
|
|
int num3 = default(int);
|
|
imagePosition.x -= edge_blur_radius;
|
|
imagePosition.y -= edge_blur_radius;
|
|
if (!(imagePosition.x >= 0f))
|
|
{
|
|
imagePosition.x = 0f;
|
|
num2 -= edge_blur_radius;
|
|
}
|
|
if (!(imagePosition.y >= 0f))
|
|
{
|
|
imagePosition.y = 0f;
|
|
num2 -= edge_blur_radius;
|
|
}
|
|
if (!(imagePosition.x <= (float)preimage.image[preimage.image_number].width - num2 - 1f))
|
|
{
|
|
imagePosition.x = (float)preimage.image[preimage.image_number].width - num2 - 1f;
|
|
num2 -= edge_blur_radius;
|
|
}
|
|
if (!(imagePosition.y <= (float)preimage.image[preimage.image_number].height - num2 - 1f))
|
|
{
|
|
imagePosition.y = (float)preimage.image[preimage.image_number].height - num2 - 1f;
|
|
num2 -= edge_blur_radius;
|
|
}
|
|
Color[] pixels = preimage.image[preimage.image_number].GetPixels((int)imagePosition.x, (int)imagePosition.y, (int)num2, (int)num2);
|
|
for (int i = 0; i < preterrain.splat.Length; i++)
|
|
{
|
|
preterrain.splat_calc[i] = 0f;
|
|
}
|
|
for (int j = 0; j < pixels.Length; j++)
|
|
{
|
|
if (current_layer.splat_output.splat.Count <= 0)
|
|
{
|
|
continue;
|
|
}
|
|
for (count_color_range = 0; count_color_range < preimage.precolor_range.color_range.Count; count_color_range++)
|
|
{
|
|
if (pixels[j] == preimage.precolor_range.color_range[count_color_range].color_start)
|
|
{
|
|
num3 = ((preimage.select_mode != select_mode_enum.free) ? preimage.precolor_range.color_range[count_color_range].select_output : ((int)preimage.precolor_range.color_range[count_color_range].output));
|
|
if (!current_layer.splat_output.splat_custom[num3].custom)
|
|
{
|
|
output_pos = current_layer.splat_output.splat[num3];
|
|
preterrain.splat_calc[(int)output_pos] = preterrain.splat_calc[(int)output_pos] + 1f / ((float)pixels.Length * 1f);
|
|
}
|
|
else
|
|
{
|
|
for (int k = 0; k < preterrain.splat_calc.Length; k++)
|
|
{
|
|
preterrain.splat_calc[k] = preterrain.splat_calc[k] + 1f / ((float)pixels.Length * 1f) * (current_layer.splat_output.splat_custom[num3].value[k] / current_layer.splat_output.splat_custom[num3].totalValue);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return color;
|
|
}
|
|
|
|
public virtual void loop_prelayer(string command, int index, bool loop_inactive)
|
|
{
|
|
bool flag = false;
|
|
bool image_auto_scale = false;
|
|
bool texture_resize_null = false;
|
|
bool flag2 = false;
|
|
bool store_last_values = false;
|
|
bool unload_texture = false;
|
|
bool flag3 = false;
|
|
bool flag4 = false;
|
|
bool flag5 = false;
|
|
bool flag6 = false;
|
|
bool flag7 = false;
|
|
bool flag8 = false;
|
|
bool flag9 = false;
|
|
bool check_measure_normal = false;
|
|
bool flag10 = false;
|
|
bool foldout_filter = false;
|
|
bool foldout_subfilter = false;
|
|
bool flag11 = false;
|
|
bool set_as_default = false;
|
|
bool flag12 = false;
|
|
layer_output_enum layer_output_enum2 = default(layer_output_enum);
|
|
bool flag13 = default(bool);
|
|
int num = default(int);
|
|
int num2 = default(int);
|
|
int num3 = default(int);
|
|
if (command.Contains("(ssc)"))
|
|
{
|
|
flag12 = true;
|
|
}
|
|
if (command.IndexOf("(gfc)") != -1)
|
|
{
|
|
flag11 = true;
|
|
}
|
|
if (command.IndexOf("(cmn)") != -1)
|
|
{
|
|
check_measure_normal = true;
|
|
}
|
|
if (command.IndexOf("(rsc") != -1)
|
|
{
|
|
flag9 = true;
|
|
}
|
|
if (command.IndexOf("(ias)") != -1)
|
|
{
|
|
image_auto_scale = true;
|
|
}
|
|
if (command.IndexOf("(trn)") != -1)
|
|
{
|
|
texture_resize_null = true;
|
|
}
|
|
if (command.IndexOf("(ed)") != -1)
|
|
{
|
|
flag2 = true;
|
|
}
|
|
if (command.IndexOf("(slv)") != -1)
|
|
{
|
|
store_last_values = true;
|
|
}
|
|
if (command.IndexOf("(ut)") != -1)
|
|
{
|
|
unload_texture = true;
|
|
}
|
|
if (command.IndexOf("(ocr)") != -1)
|
|
{
|
|
flag4 = true;
|
|
}
|
|
if (command.IndexOf("(asr)") != -1)
|
|
{
|
|
flag5 = true;
|
|
}
|
|
if (command.IndexOf("(cpo)") != -1)
|
|
{
|
|
flag = true;
|
|
}
|
|
if (command.IndexOf("(inf)") != -1)
|
|
{
|
|
flag7 = true;
|
|
}
|
|
if (command.IndexOf("(eho)") != -1)
|
|
{
|
|
flag8 = true;
|
|
}
|
|
if (command.IndexOf("(caf)") != -1)
|
|
{
|
|
flag10 = true;
|
|
}
|
|
if (command.IndexOf("(ff)") != -1)
|
|
{
|
|
foldout_filter = true;
|
|
}
|
|
if (command.IndexOf("(fs)") != -1)
|
|
{
|
|
foldout_subfilter = true;
|
|
}
|
|
if (command.IndexOf("(sad)") != -1)
|
|
{
|
|
set_as_default = true;
|
|
}
|
|
if (command.IndexOf("(fix)") != -1)
|
|
{
|
|
flag6 = true;
|
|
}
|
|
if (flag6 || flag7)
|
|
{
|
|
reset_link_filter();
|
|
reset_link_subfilter();
|
|
settings.prelayers_linked = 0;
|
|
settings.filters_linked = 0;
|
|
settings.subfilters_linked = 0;
|
|
}
|
|
if (command.IndexOf("(fl)") != -1)
|
|
{
|
|
if (command.IndexOf("(heightmap)") != -1)
|
|
{
|
|
layer_output_enum2 = layer_output_enum.heightmap;
|
|
}
|
|
else if (command.IndexOf("(color)") != -1)
|
|
{
|
|
layer_output_enum2 = layer_output_enum.color;
|
|
}
|
|
else if (command.IndexOf("(splat)") != -1)
|
|
{
|
|
layer_output_enum2 = layer_output_enum.splat;
|
|
}
|
|
else if (command.IndexOf("(tree)") != -1)
|
|
{
|
|
layer_output_enum2 = layer_output_enum.tree;
|
|
}
|
|
else if (command.IndexOf("(grass)") != -1)
|
|
{
|
|
layer_output_enum2 = layer_output_enum.grass;
|
|
}
|
|
else if (command.IndexOf("(object)") != -1)
|
|
{
|
|
layer_output_enum2 = layer_output_enum.@object;
|
|
}
|
|
if (command.IndexOf("(true)") != -1)
|
|
{
|
|
flag13 = true;
|
|
}
|
|
else if (command.IndexOf("(false)") != -1)
|
|
{
|
|
flag13 = false;
|
|
}
|
|
flag3 = true;
|
|
}
|
|
for (count_prelayer = 0; count_prelayer < prelayers.Count; count_prelayer++)
|
|
{
|
|
prelayer_class prelayer_class2 = prelayers[count_prelayer];
|
|
if (flag5)
|
|
{
|
|
if (settings.showTerrains)
|
|
{
|
|
if (prelayers[count_prelayer].prearea.resolution_mode == resolution_mode_enum.Automatic)
|
|
{
|
|
select_automatic_step_resolution(terrains[0], prelayers[count_prelayer].prearea);
|
|
}
|
|
set_area_resolution(terrains[0], prelayers[count_prelayer].prearea);
|
|
prelayers[count_prelayer].prearea.area_old = prelayers[count_prelayer].prearea.area;
|
|
prelayers[count_prelayer].prearea.step_old = prelayers[count_prelayer].prearea.step;
|
|
}
|
|
else
|
|
{
|
|
select_automatic_step_resolution_mesh(prelayers[count_prelayer].prearea);
|
|
set_area_resolution(prelayers[count_prelayer].prearea);
|
|
prelayers[count_prelayer].prearea.area_old = prelayers[count_prelayer].prearea.area;
|
|
prelayers[count_prelayer].prearea.step_old = prelayers[count_prelayer].prearea.step;
|
|
}
|
|
}
|
|
if (flag9 || flag10)
|
|
{
|
|
for (int i = 0; i < prelayers[count_prelayer].predescription.description.Count; i++)
|
|
{
|
|
if (flag9)
|
|
{
|
|
prelayers[count_prelayer].predescription.description[i].swap_text = "S";
|
|
prelayers[count_prelayer].predescription.description[i].swap_select = false;
|
|
prelayers[count_prelayer].predescription.description[i].copy_select = false;
|
|
}
|
|
if (flag10)
|
|
{
|
|
prelayers[count_prelayer].predescription.description[i].foldout = false;
|
|
}
|
|
}
|
|
}
|
|
if (flag10)
|
|
{
|
|
prelayers[count_prelayer].prearea.foldout = false;
|
|
}
|
|
for (count_layer = 0; count_layer < prelayer_class2.layer.Count; count_layer++)
|
|
{
|
|
layer_class layer_class2 = prelayer_class2.layer[count_layer];
|
|
if (flag2)
|
|
{
|
|
bool flag14 = false;
|
|
if (!layer_class2.active)
|
|
{
|
|
flag14 = true;
|
|
}
|
|
else if ((layer_class2.output != layer_output_enum.color || !color_output) && (layer_class2.output != layer_output_enum.splat || !splat_output) && (layer_class2.output != layer_output_enum.tree || !tree_output) && (layer_class2.output != layer_output_enum.grass || !grass_output) && (layer_class2.output != layer_output_enum.@object || !object_output) && (layer_class2.output != layer_output_enum.heightmap || !heightmap_output))
|
|
{
|
|
flag14 = true;
|
|
}
|
|
if (flag14)
|
|
{
|
|
erase_layer(prelayer_class2, count_layer, 0, 0, false, true, false);
|
|
count_layer--;
|
|
continue;
|
|
}
|
|
if (layer_class2.output == layer_output_enum.color)
|
|
{
|
|
for (int j = 0; j < layer_class2.color_output.precolor_range.Count; j++)
|
|
{
|
|
for (int k = 0; k < layer_class2.color_output.precolor_range[j].color_range.Count; k++)
|
|
{
|
|
if (!layer_class2.color_output.precolor_range[j].color_range_value.active[k])
|
|
{
|
|
layer_class2.color_output.precolor_range[j].erase_color_range(k);
|
|
loop_prefilter_index(layer_class2.prefilter, k);
|
|
k--;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if (layer_class2.output == layer_output_enum.splat)
|
|
{
|
|
for (num = 0; num < layer_class2.splat_output.splat.Count; num++)
|
|
{
|
|
if (!layer_class2.splat_output.splat_value.active[num] || layer_class2.splat_output.splat[num] > terrains[0].terrain.terrainData.splatPrototypes.Length - 1)
|
|
{
|
|
layer_class2.splat_output.erase_splat(num);
|
|
loop_prefilter_index(layer_class2.prefilter, num);
|
|
num--;
|
|
}
|
|
}
|
|
}
|
|
else if (layer_class2.output == layer_output_enum.grass)
|
|
{
|
|
for (int l = 0; l < layer_class2.grass_output.grass_value.active.Count; l++)
|
|
{
|
|
if (!layer_class2.grass_output.grass_value.active[l] || layer_class2.grass_output.grass[l].prototypeindex > terrains[0].terrain.terrainData.detailPrototypes.Length - 1)
|
|
{
|
|
layer_class2.grass_output.erase_grass(l);
|
|
loop_prefilter_index(layer_class2.prefilter, l);
|
|
l--;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (flag12)
|
|
{
|
|
layer_class2.splat_output.SyncSplatCustom(masterTerrain.splatPrototypes.Count);
|
|
}
|
|
if (flag9)
|
|
{
|
|
layer_class2.swap_text = "S";
|
|
layer_class2.swap_select = false;
|
|
layer_class2.copy_select = false;
|
|
layer_class2.tree_output.placed = 0;
|
|
layer_class2.object_output.placed = 0;
|
|
layer_class2.text_placed = string.Empty;
|
|
for (num2 = 0; num2 < layer_class2.tree_output.tree.Count; num2++)
|
|
{
|
|
layer_class2.tree_output.tree[num2].placed = 0;
|
|
}
|
|
for (num3 = 0; num3 < layer_class2.object_output.@object.Count; num3++)
|
|
{
|
|
layer_class2.object_output.@object[num3].placed = 0;
|
|
}
|
|
}
|
|
if (flag10)
|
|
{
|
|
layer_class2.foldout = false;
|
|
layer_class2.tree_output.foldout = false;
|
|
for (num2 = 0; num2 < layer_class2.tree_output.tree.Count; num2++)
|
|
{
|
|
layer_class2.tree_output.tree[num2].foldout = false;
|
|
layer_class2.tree_output.tree[num2].scale_foldout = false;
|
|
layer_class2.tree_output.tree[num2].distance_foldout = false;
|
|
layer_class2.tree_output.tree[num2].data_foldout = false;
|
|
layer_class2.tree_output.tree[num2].precolor_range.foldout = false;
|
|
}
|
|
layer_class2.object_output.foldout = false;
|
|
for (num3 = 0; num3 < layer_class2.object_output.@object.Count; num3++)
|
|
{
|
|
layer_class2.object_output.@object[num3].foldout = false;
|
|
layer_class2.object_output.@object[num3].data_foldout = false;
|
|
layer_class2.object_output.@object[num3].transform_foldout = false;
|
|
layer_class2.object_output.@object[num3].settings_foldout = false;
|
|
layer_class2.object_output.@object[num3].distance_foldout = false;
|
|
layer_class2.object_output.@object[num3].rotation_foldout = false;
|
|
layer_class2.object_output.@object[num3].rotation_map_foldout = false;
|
|
}
|
|
}
|
|
if (!layer_class2.active && !loop_inactive)
|
|
{
|
|
continue;
|
|
}
|
|
if (flag8 && layer_class2.output == layer_output_enum.heightmap)
|
|
{
|
|
if (layer_class2.smooth)
|
|
{
|
|
smooth_command = true;
|
|
}
|
|
heightmap_output_layer = true;
|
|
}
|
|
if (flag3)
|
|
{
|
|
if (layer_class2.output == layer_output_enum2)
|
|
{
|
|
if (flag13)
|
|
{
|
|
layer_class2.foldout = false;
|
|
}
|
|
else
|
|
{
|
|
layer_class2.foldout = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
layer_class2.foldout = false;
|
|
}
|
|
}
|
|
for (num2 = 0; num2 < layer_class2.tree_output.tree.Count; num2++)
|
|
{
|
|
if (flag2)
|
|
{
|
|
if (!layer_class2.tree_output.tree_value.active[num2] || layer_class2.tree_output.tree[num2].prototypeindex > terrains[0].terrain.terrainData.treePrototypes.Length - 1)
|
|
{
|
|
layer_class2.tree_output.erase_tree(num2, this);
|
|
loop_prefilter_index(layer_class2.prefilter, num2);
|
|
num2--;
|
|
continue;
|
|
}
|
|
erase_deactive_color_range(layer_class2.tree_output.tree[num2].precolor_range);
|
|
}
|
|
call_from = 1;
|
|
loop_prefilter(layer_class2.tree_output.tree[num2].prefilter, index, flag6, flag7, loop_inactive, image_auto_scale, texture_resize_null, unload_texture, flag2, store_last_values, flag9, check_measure_normal, flag10, foldout_filter, foldout_subfilter, set_as_default);
|
|
}
|
|
if (layer_class2.output == layer_output_enum.@object)
|
|
{
|
|
for (num3 = 0; num3 < layer_class2.object_output.@object.Count; num3++)
|
|
{
|
|
if (flag2 && (!layer_class2.object_output.object_value.active[num3] || !layer_class2.object_output.@object[num3].object1))
|
|
{
|
|
erase_object(prelayers[count_prelayer].layer[count_layer].object_output, num3);
|
|
loop_prefilter_index(layer_class2.prefilter, num3);
|
|
num3--;
|
|
continue;
|
|
}
|
|
object_class object_class2 = layer_class2.object_output.@object[num3];
|
|
if ((flag6 || flag7) && object_class2.prelayer_created)
|
|
{
|
|
if (object_class2.prelayer_index > prelayers.Count - 1)
|
|
{
|
|
if (!flag7)
|
|
{
|
|
Debug.Log("Prelayer reference -> " + object_class2.prelayer_index + " not found, erasing reference entry...");
|
|
object_class2.prelayer_created = false;
|
|
object_class2.prelayer_index = -1;
|
|
}
|
|
}
|
|
else if (!flag7)
|
|
{
|
|
prelayers[object_class2.prelayer_index].linked = true;
|
|
}
|
|
else
|
|
{
|
|
settings.prelayers_linked++;
|
|
}
|
|
}
|
|
if (((layer_class2.object_output.object_value.active[num3] && object_output) || loop_inactive) && flag)
|
|
{
|
|
if (flag4)
|
|
{
|
|
create_object_child_list(object_class2);
|
|
}
|
|
if (object_class2.parent_clear || loop_inactive)
|
|
{
|
|
clear_parent_object(object_class2);
|
|
}
|
|
}
|
|
if (object_class2.rotation_map.active)
|
|
{
|
|
object_class2.rotation_map.preimage.set_image_auto_scale(terrains[0], prelayers[count_prelayer].prearea.area_old, 0);
|
|
}
|
|
}
|
|
}
|
|
call_from = 0;
|
|
loop_prefilter(layer_class2.prefilter, index, flag6, flag7, loop_inactive, image_auto_scale, texture_resize_null, unload_texture, flag2, store_last_values, flag9, check_measure_normal, flag10, foldout_filter, foldout_subfilter, set_as_default);
|
|
}
|
|
}
|
|
if (flag7 || flag6)
|
|
{
|
|
erase_unlinked_prelayer(flag6);
|
|
erase_unlinked_filter(flag6);
|
|
erase_unlinked_subfilter(flag6);
|
|
}
|
|
}
|
|
|
|
public virtual void loop_prefilter(prefilter_class prefilter1, int index, bool fix_database, bool info_database, bool loop_inactive, bool image_auto_scale, bool texture_resize_null, bool unload_texture, bool erase_deactive, bool store_last_values, bool reset_swap_copy, bool check_measure_normal, bool close_all_foldout, bool foldout_filter, bool foldout_subfilter, bool set_as_default)
|
|
{
|
|
if (close_all_foldout)
|
|
{
|
|
prefilter1.foldout = false;
|
|
}
|
|
for (count_filter = 0; count_filter < prefilter1.filter_index.Count; count_filter++)
|
|
{
|
|
filter_class filter_class2 = filter[prefilter1.filter_index[count_filter]];
|
|
if (erase_deactive)
|
|
{
|
|
if (!filter_class2.active)
|
|
{
|
|
erase_filter(count_filter, prefilter1);
|
|
count_filter--;
|
|
continue;
|
|
}
|
|
erase_deactive_color_range(filter_class2.preimage.precolor_range);
|
|
erase_deactive_animation_curve(filter_class2.precurve_list);
|
|
}
|
|
if (fix_database || info_database)
|
|
{
|
|
if (prefilter1.filter_index[count_filter] > filter.Count - 1)
|
|
{
|
|
Debug.Log("Filter reference -> " + prefilter1.filter_index[count_filter] + " not found, erasing reference entry...");
|
|
if (!info_database)
|
|
{
|
|
erase_filter_reference(prefilter1, count_filter);
|
|
count_filter--;
|
|
continue;
|
|
}
|
|
}
|
|
else if (filter[prefilter1.filter_index[count_filter]].linked)
|
|
{
|
|
Debug.Log("Filter double linked -> " + prefilter1.filter_index[count_filter]);
|
|
if (fix_database)
|
|
{
|
|
filter.Add(new filter_class());
|
|
filter[filter.Count - 1] = copy_filter(filter[prefilter1.filter_index[count_filter]], true);
|
|
prefilter1.filter_index[count_filter] = filter.Count - 1;
|
|
continue;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
filter[prefilter1.filter_index[count_filter]].linked = true;
|
|
if (filter[prefilter1.filter_index[count_filter]].linked)
|
|
{
|
|
settings.filters_linked++;
|
|
}
|
|
}
|
|
}
|
|
if (foldout_filter && prefilter1.filter_index[count_filter] == index)
|
|
{
|
|
int num = get_layer_description(prelayers[count_prelayer], count_layer);
|
|
if (num != -1)
|
|
{
|
|
prelayers[count_prelayer].predescription.description[num].foldout = true;
|
|
}
|
|
prelayers[count_prelayer].foldout = true;
|
|
prelayers[count_prelayer].layer[count_layer].foldout = true;
|
|
if (call_from == 1)
|
|
{
|
|
prelayers[count_prelayer].layer[count_layer].tree_output.foldout = true;
|
|
prelayers[count_prelayer].layer[count_layer].tree_output.tree[count_tree].foldout = true;
|
|
}
|
|
prefilter1.foldout = true;
|
|
filter_class2.foldout = true;
|
|
}
|
|
if (set_as_default)
|
|
{
|
|
for (int i = 0; i < filter_class2.precurve_list.Count; i++)
|
|
{
|
|
filter_class2.precurve_list[i].set_as_default();
|
|
}
|
|
}
|
|
if (close_all_foldout)
|
|
{
|
|
filter_class2.foldout = false;
|
|
filter_class2.presubfilter.foldout = false;
|
|
}
|
|
if (reset_swap_copy)
|
|
{
|
|
filter[prefilter1.filter_index[count_filter]].swap_text = "S";
|
|
filter[prefilter1.filter_index[count_filter]].swap_select = false;
|
|
filter[prefilter1.filter_index[count_filter]].copy_select = false;
|
|
}
|
|
if (check_measure_normal && filter_class2.active && !measure_normal && filter_class2.type == condition_type_enum.Direction)
|
|
{
|
|
measure_normal = true;
|
|
}
|
|
if (!filter_class2.active && !loop_inactive)
|
|
{
|
|
continue;
|
|
}
|
|
if (image_auto_scale && filter_class2.preimage.image_auto_scale && settings.showTerrains)
|
|
{
|
|
if (!prelayers[count_prelayer].prearea.active)
|
|
{
|
|
filter_class2.preimage.set_image_auto_scale(terrains[0], terrains[0].prearea.area_old, 0);
|
|
}
|
|
else
|
|
{
|
|
filter_class2.preimage.set_image_auto_scale(terrains[0], prelayers[count_prelayer].prearea.area_old, 0);
|
|
}
|
|
}
|
|
if (unload_texture && filter_class2.preimage.image.Count > 0)
|
|
{
|
|
for (int j = 0; j < filter_class2.preimage.image.Count; j++)
|
|
{
|
|
if ((bool)current_filter.preimage.image[j])
|
|
{
|
|
Resources.UnloadAsset(filter_class2.preimage.image[j]);
|
|
}
|
|
}
|
|
}
|
|
filter_class2.sub_strength_set = false;
|
|
for (count_subfilter = 0; count_subfilter < filter_class2.presubfilter.subfilter_index.Count; count_subfilter++)
|
|
{
|
|
subfilter_class subfilter_class2 = subfilter[filter_class2.presubfilter.subfilter_index[count_subfilter]];
|
|
if (erase_deactive)
|
|
{
|
|
if (!subfilter_class2.active)
|
|
{
|
|
erase_subfilter(count_subfilter, filter_class2.presubfilter);
|
|
count_subfilter--;
|
|
continue;
|
|
}
|
|
erase_deactive_animation_curve(subfilter_class2.precurve_list);
|
|
erase_deactive_color_range(subfilter_class2.preimage.precolor_range);
|
|
}
|
|
if (fix_database || info_database)
|
|
{
|
|
if (filter_class2.presubfilter.subfilter_index[count_subfilter] > subfilter.Count - 1)
|
|
{
|
|
Debug.Log("Subfilter reference -> " + filter_class2.presubfilter.subfilter_index[count_subfilter] + " not found, erasing reference entry...");
|
|
if (!info_database)
|
|
{
|
|
erase_subfilter_reference(filter_class2.presubfilter, count_subfilter);
|
|
count_subfilter--;
|
|
continue;
|
|
}
|
|
}
|
|
if (subfilter[filter_class2.presubfilter.subfilter_index[count_subfilter]].linked)
|
|
{
|
|
Debug.Log("Subfilter double linked -> " + filter_class2.presubfilter.subfilter_index[count_subfilter]);
|
|
if (fix_database)
|
|
{
|
|
subfilter.Add(new subfilter_class());
|
|
subfilter[subfilter.Count - 1] = copy_subfilter(subfilter[filter_class2.presubfilter.subfilter_index[count_subfilter]]);
|
|
filter_class2.presubfilter.subfilter_index[count_subfilter] = subfilter.Count - 1;
|
|
continue;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
subfilter[filter_class2.presubfilter.subfilter_index[count_subfilter]].linked = true;
|
|
if (filter[prefilter1.filter_index[count_filter]].linked)
|
|
{
|
|
settings.subfilters_linked++;
|
|
}
|
|
}
|
|
}
|
|
if (foldout_subfilter && filter_class2.presubfilter.subfilter_index[count_subfilter] == index)
|
|
{
|
|
int num2 = get_layer_description(prelayers[count_prelayer], count_layer);
|
|
if (num2 != -1)
|
|
{
|
|
prelayers[count_prelayer].predescription.description[num2].foldout = true;
|
|
}
|
|
prelayers[count_prelayer].foldout = true;
|
|
prelayers[count_prelayer].layer[count_layer].foldout = true;
|
|
if (call_from == 1)
|
|
{
|
|
prelayers[count_prelayer].layer[count_layer].tree_output.foldout = true;
|
|
prelayers[count_prelayer].layer[count_layer].tree_output.tree[count_tree].foldout = true;
|
|
}
|
|
prefilter1.foldout = true;
|
|
subfilter_class2.foldout = true;
|
|
filter_class2.foldout = true;
|
|
filter_class2.presubfilter.foldout = true;
|
|
}
|
|
if (set_as_default)
|
|
{
|
|
subfilter_class2.precurve.set_as_default();
|
|
subfilter_class2.prerandom_curve.set_as_default();
|
|
}
|
|
if (close_all_foldout)
|
|
{
|
|
subfilter_class2.foldout = false;
|
|
}
|
|
if (check_measure_normal && subfilter_class2.active && !measure_normal && subfilter_class2.type == condition_type_enum.Direction)
|
|
{
|
|
measure_normal = true;
|
|
}
|
|
if (reset_swap_copy)
|
|
{
|
|
subfilter_class2.swap_text = "S";
|
|
subfilter_class2.swap_select = false;
|
|
subfilter_class2.copy_select = false;
|
|
}
|
|
if (!subfilter_class2.active && !loop_inactive)
|
|
{
|
|
continue;
|
|
}
|
|
if (image_auto_scale && subfilter_class2.preimage.image_auto_scale && settings.showTerrains)
|
|
{
|
|
if (!prelayers[count_prelayer].prearea.active)
|
|
{
|
|
subfilter_class2.preimage.set_image_auto_scale(terrains[0], terrains[0].prearea.area_old, 0);
|
|
}
|
|
else
|
|
{
|
|
subfilter_class2.preimage.set_image_auto_scale(terrains[0], prelayers[count_prelayer].prearea.area_old, 0);
|
|
}
|
|
}
|
|
if (subfilter_class2.mode == subfilter_mode_enum.strength)
|
|
{
|
|
filter_class2.sub_strength_set = true;
|
|
}
|
|
if (store_last_values && subfilter_class2.mode != subfilter_mode_enum.strength && !current_filter.last_value_declared)
|
|
{
|
|
filter_class2.last_value_x = new float[1];
|
|
if (generate_world_mode)
|
|
{
|
|
filter_class2.last_value_y = new float[(int)(prelayers[count_prelayer].prearea.area.width / prelayers[count_prelayer].prearea.step.x + 1f)];
|
|
}
|
|
else
|
|
{
|
|
filter_class2.last_value_y = new float[(int)(terrains[0].size.x / terrains[0].prearea.step.x + 2f)];
|
|
}
|
|
filter_class2.last_pos_x = 4097f;
|
|
filter_class2.last_value_declared = true;
|
|
}
|
|
if (!unload_texture)
|
|
{
|
|
continue;
|
|
}
|
|
for (int j = 0; j < subfilter_class2.preimage.image.Count; j++)
|
|
{
|
|
if (subfilter_class2.preimage.image != null)
|
|
{
|
|
Resources.UnloadAsset(subfilter_class2.preimage.image[j]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual Rect get_terrain_size(int terrain_index)
|
|
{
|
|
Rect result = default(Rect);
|
|
if ((bool)terrains[terrain_index].terrain && (bool)terrains[terrain_index].terrain.terrainData)
|
|
{
|
|
result.width = terrains[terrain_index].terrain.terrainData.size.x;
|
|
result.height = terrains[terrain_index].terrain.terrainData.size.z;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual Rect get_total_terrain_size()
|
|
{
|
|
Rect result = default(Rect);
|
|
if ((bool)terrains[0].terrain && (bool)terrains[0].terrain.terrainData)
|
|
{
|
|
result.width = terrains[0].terrain.terrainData.size.x * terrains[0].tiles.x;
|
|
result.height = terrains[0].terrain.terrainData.size.z * terrains[0].tiles.y;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual void loop_prefilter_index(prefilter_class prefilter1, int index)
|
|
{
|
|
for (int i = 0; i < prefilter1.filter_index.Count; i++)
|
|
{
|
|
if (filter[prefilter1.filter_index[i]].type != condition_type_enum.Image || filter[prefilter1.filter_index[i]].preimage.select_mode != select_mode_enum.select)
|
|
{
|
|
continue;
|
|
}
|
|
for (int j = 0; j < filter[prefilter1.filter_index[i]].preimage.precolor_range.color_range.Count; j++)
|
|
{
|
|
if (filter[prefilter1.filter_index[i]].preimage.precolor_range.color_range[j].select_output == index)
|
|
{
|
|
filter[prefilter1.filter_index[i]].preimage.precolor_range.erase_color_range(j);
|
|
j--;
|
|
}
|
|
else if (filter[prefilter1.filter_index[i]].preimage.precolor_range.color_range[j].select_output > index)
|
|
{
|
|
filter[prefilter1.filter_index[i]].preimage.precolor_range.color_range[j].select_output = index;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void disable_prefilter_select_mode(prefilter_class prefilter1)
|
|
{
|
|
for (int i = 0; i < prefilter1.filter_index.Count; i++)
|
|
{
|
|
filter[prefilter1.filter_index[i]].preimage.select_mode = select_mode_enum.free;
|
|
}
|
|
}
|
|
|
|
public virtual void link_placed_reference()
|
|
{
|
|
if (!script_base)
|
|
{
|
|
return;
|
|
}
|
|
int num = default(int);
|
|
int num2 = default(int);
|
|
int num3 = default(int);
|
|
for (int i = 0; i < prelayers.Count; i++)
|
|
{
|
|
for (num = 0; num < prelayers[i].layer.Count; num++)
|
|
{
|
|
if (!prelayers[i].layer[num].active)
|
|
{
|
|
continue;
|
|
}
|
|
if (prelayers[i].layer[num].output == layer_output_enum.tree)
|
|
{
|
|
prelayers[i].layer[num].tree_output.placed = 0;
|
|
prelayers[i].layer[num].tree_output.placed_reference = script_base.prelayers[i].layer[num].tree_output;
|
|
for (num2 = 0; num2 < prelayers[i].layer[num].tree_output.tree.Count; num2++)
|
|
{
|
|
prelayers[i].layer[num].tree_output.tree[num2].placed = 0;
|
|
prelayers[i].layer[num].tree_output.tree[num2].placed_reference = script_base.prelayers[i].layer[num].tree_output.tree[num2];
|
|
}
|
|
}
|
|
if (prelayers[i].layer[num].output != layer_output_enum.@object)
|
|
{
|
|
continue;
|
|
}
|
|
prelayers[i].layer[num].object_output.placed = 0;
|
|
prelayers[i].layer[num].object_output.placed_reference = script_base.prelayers[i].layer[num].object_output;
|
|
if (prelayers[i].layer[num].object_output.object_mode == object_mode_enum.LinePlacement)
|
|
{
|
|
script_base.prelayers[i].layer[num].object_output.line_placement.line_list[0].points.Clear();
|
|
for (int j = 0; j < prelayers[i].layer[num].object_output.line_placement.line_list[0].point_length; j++)
|
|
{
|
|
script_base.prelayers[i].layer[num].object_output.line_placement.line_list[0].points.Add(new Vector3(0f, 0f, 0f));
|
|
}
|
|
if (prelayers[i].layer[num].object_output.line_placement.preimage.image_auto_scale && settings.showTerrains)
|
|
{
|
|
if (!generate_world_mode && i < 1)
|
|
{
|
|
prelayers[i].layer[num].object_output.line_placement.preimage.set_image_auto_scale(terrains[0], terrains[0].prearea.area_old, 0);
|
|
}
|
|
else
|
|
{
|
|
prelayers[i].layer[num].object_output.line_placement.preimage.set_image_auto_scale(terrains[0], prelayers[i].prearea.area_old, 0);
|
|
}
|
|
}
|
|
line_output = true;
|
|
}
|
|
for (num3 = 0; num3 < prelayers[i].layer[num].object_output.@object.Count; num3++)
|
|
{
|
|
prelayers[i].layer[num].object_output.@object[num3].placed = 0;
|
|
prelayers[i].layer[num].object_output.@object[num3].placed_reference = script_base.prelayers[i].layer[num].object_output.@object[num3];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void erase_deactive_color_range(precolor_range_class precolor_range)
|
|
{
|
|
for (int i = 0; i < precolor_range.color_range.Count; i++)
|
|
{
|
|
if (!precolor_range.color_range_value.active[i])
|
|
{
|
|
precolor_range.erase_color_range(i);
|
|
i--;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void erase_deactive_animation_curve(List<animation_curve_class> precurve_list)
|
|
{
|
|
for (int i = 0; i < precurve_list.Count; i++)
|
|
{
|
|
if (!precurve_list[i].active)
|
|
{
|
|
erase_animation_curve(precurve_list, i);
|
|
i--;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void clear_parent_object(object_class current_object1)
|
|
{
|
|
Transform transform = null;
|
|
if (settings.parentObjectsTerrain)
|
|
{
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
for (int j = 0; j < terrains[i].terrain.transform.childCount; j++)
|
|
{
|
|
transform = terrains[i].terrain.transform.GetChild(j);
|
|
if (transform.name == "Objects")
|
|
{
|
|
UnityEngine.Object.DestroyImmediate(transform.gameObject);
|
|
j--;
|
|
}
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
Transform parent = current_object1.parent;
|
|
if (!parent || !current_object1.parent_clear)
|
|
{
|
|
return;
|
|
}
|
|
int instanceID = parent.gameObject.GetInstanceID();
|
|
Transform[] componentsInChildren = parent.GetComponentsInChildren<Transform>(true);
|
|
if (componentsInChildren == null)
|
|
{
|
|
return;
|
|
}
|
|
IEnumerator enumerator = componentsInChildren.GetEnumerator();
|
|
while (enumerator.MoveNext())
|
|
{
|
|
object obj = enumerator.Current;
|
|
if (!(obj is Transform))
|
|
{
|
|
obj = RuntimeServices.Coerce(obj, typeof(Transform));
|
|
}
|
|
transform = (Transform)obj;
|
|
if ((bool)transform && transform.gameObject.GetInstanceID() != instanceID)
|
|
{
|
|
UnityEngine.Object.DestroyImmediate(transform.gameObject);
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void unload_textures1()
|
|
{
|
|
int num = default(int);
|
|
for (int i = 0; i < filter.Count; i++)
|
|
{
|
|
for (num = 0; num < filter[i].preimage.image.Count; num++)
|
|
{
|
|
if ((bool)filter[i].preimage.image[num])
|
|
{
|
|
Resources.UnloadAsset(filter[i].preimage.image[num]);
|
|
}
|
|
}
|
|
}
|
|
for (int j = 0; j < subfilter.Count; j++)
|
|
{
|
|
for (num = 0; num < subfilter[j].preimage.image.Count; num++)
|
|
{
|
|
if ((bool)subfilter[j].preimage.image[num])
|
|
{
|
|
Resources.UnloadAsset(subfilter[j].preimage.image[num]);
|
|
}
|
|
}
|
|
}
|
|
if (!settings.showTerrains)
|
|
{
|
|
return;
|
|
}
|
|
for (int k = 0; k < terrains.Count; k++)
|
|
{
|
|
if (terrains[k].terrain.terrainData.splatPrototypes.Length <= 0)
|
|
{
|
|
continue;
|
|
}
|
|
for (int l = 0; l < terrains[k].splat_alpha.Length; l++)
|
|
{
|
|
if ((bool)terrains[k].splat_alpha[l])
|
|
{
|
|
terrains[k].splat_alpha[l] = null;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void loop_layer(layer_class layer, int command)
|
|
{
|
|
for (int i = 0; i < layer.object_output.@object.Count; i++)
|
|
{
|
|
if (!layer.object_output.@object[i].prelayer_created)
|
|
{
|
|
continue;
|
|
}
|
|
switch (command)
|
|
{
|
|
case 1:
|
|
{
|
|
add_prelayer(false);
|
|
int num = prelayers.Count - 1;
|
|
prelayers[num] = copy_prelayer(prelayers[layer.object_output.@object[i].prelayer_index], true);
|
|
layer.object_output.@object[i].prelayer_index = num;
|
|
prelayers[num].index = num;
|
|
prelayers[num].set_prelayer_text();
|
|
for (int j = 0; j < prelayers[num].layer.Count; j++)
|
|
{
|
|
loop_layer(prelayers[num].layer[j], 1);
|
|
}
|
|
break;
|
|
}
|
|
case -1:
|
|
erase_prelayer(layer.object_output.@object[i].prelayer_index);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void loop_object_copy(object_class @object)
|
|
{
|
|
if (@object.prelayer_created)
|
|
{
|
|
for (int i = 0; i < prelayers[@object.prelayer_index].layer.Count; i++)
|
|
{
|
|
loop_layer_copy(prelayers[@object.prelayer_index].layer[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void loop_layer_copy(layer_class layer)
|
|
{
|
|
for (int i = 0; i < layer.object_output.@object.Count; i++)
|
|
{
|
|
layer.object_output.@object[i].swap_select = false;
|
|
layer.object_output.@object[i].copy_select = false;
|
|
layer.object_output.@object[i].swap_text = "S";
|
|
layer.object_output.@object[i].placed = 0;
|
|
layer.object_output.placed = 0;
|
|
if (layer.object_output.@object[i].prelayer_created)
|
|
{
|
|
int prelayer_index = layer.object_output.@object[i].prelayer_index;
|
|
for (int j = 0; j < prelayers[prelayer_index].layer.Count; j++)
|
|
{
|
|
loop_layer_copy(prelayers[prelayer_index].layer[j]);
|
|
}
|
|
}
|
|
}
|
|
int num = default(int);
|
|
for (int k = 0; k < layer.color_output.precolor_range.Count; k++)
|
|
{
|
|
for (num = 0; num < layer.color_output.precolor_range[k].color_range.Count; num++)
|
|
{
|
|
layer.color_output.precolor_range[k].color_range[num].swap_select = false;
|
|
layer.color_output.precolor_range[k].color_range[num].copy_select = false;
|
|
layer.color_output.precolor_range[k].color_range[num].swap_text = "S";
|
|
}
|
|
}
|
|
for (int l = 0; l < layer.tree_output.tree.Count; l++)
|
|
{
|
|
layer.tree_output.tree[l].swap_select = false;
|
|
layer.tree_output.tree[l].copy_select = false;
|
|
layer.tree_output.tree[l].swap_text = "S";
|
|
layer.tree_output.placed = 0;
|
|
layer.tree_output.tree[l].placed = 0;
|
|
layer.tree_output.tree[l].placed = 0;
|
|
}
|
|
layer.swap_select = false;
|
|
layer.copy_select = false;
|
|
layer.swap_text = "S";
|
|
}
|
|
|
|
public virtual int check_object_rotate(List<Vector3> objects_placed, List<Vector3> objects_placed_rot, Vector3 position, int min_distance_rot_x, int min_distance_rot_z)
|
|
{
|
|
Vector3 vector = default(Vector3);
|
|
int num = 0;
|
|
int result;
|
|
while (true)
|
|
{
|
|
if (num < objects_placed.Count)
|
|
{
|
|
vector = position - objects_placed[num];
|
|
if (!(Mathf.Abs(vector.x) > (float)min_distance_rot_x) && !(Mathf.Abs(vector.z) > (float)min_distance_rot_z))
|
|
{
|
|
result = num;
|
|
break;
|
|
}
|
|
num++;
|
|
continue;
|
|
}
|
|
result = -1;
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual bool check_object_distance(List<distance_class> object_placed_list)
|
|
{
|
|
float num = default(float);
|
|
float num2 = default(float);
|
|
int num3 = object_placed_list.Count - 1;
|
|
int result;
|
|
while (true)
|
|
{
|
|
if (num3 >= 0)
|
|
{
|
|
num = Vector3.Distance(object_info.position, object_placed_list[num3].position);
|
|
num2 = object_placed_list[num3].position.z - object_info.position.z;
|
|
if (!(num >= object_info.min_distance.x) && !(num >= object_placed_list[num3].min_distance.x))
|
|
{
|
|
result = 0;
|
|
break;
|
|
}
|
|
num3--;
|
|
continue;
|
|
}
|
|
object_placed_list.Add(new distance_class());
|
|
object_placed_list[object_placed_list.Count - 1].position = object_info.position;
|
|
object_placed_list[object_placed_list.Count - 1].rotation = object_info.rotation;
|
|
object_placed_list[object_placed_list.Count - 1].min_distance = object_info.min_distance;
|
|
object_placed_list[object_placed_list.Count - 1].min_distance_rotation_group = object_info.min_distance_rotation_group;
|
|
object_placed_list[object_placed_list.Count - 1].distance_rotation = object_info.distance_rotation;
|
|
object_placed_list[object_placed_list.Count - 1].distance_mode = object_info.distance_mode;
|
|
object_placed_list[object_placed_list.Count - 1].rotation_group = object_info.rotation_group;
|
|
result = 1;
|
|
break;
|
|
}
|
|
return (byte)result != 0;
|
|
}
|
|
|
|
public virtual void relink_subfilter_index(int subfilter_index)
|
|
{
|
|
for (int i = 0; i < filter.Count; i++)
|
|
{
|
|
for (int j = 0; j < filter[i].presubfilter.subfilter_index.Count; j++)
|
|
{
|
|
if (filter[i].presubfilter.subfilter_index[j] == subfilter.Count)
|
|
{
|
|
filter[i].presubfilter.subfilter_index[j] = subfilter_index;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void relink_filter_index(int filter_index)
|
|
{
|
|
for (int i = 0; i < prelayers.Count; i++)
|
|
{
|
|
for (int j = 0; j < prelayers[i].layer.Count; j++)
|
|
{
|
|
for (int k = 0; k < prelayers[i].layer[j].prefilter.filter_index.Count; k++)
|
|
{
|
|
if (prelayers[i].layer[j].prefilter.filter_index[k] == filter.Count)
|
|
{
|
|
prelayers[i].layer[j].prefilter.filter_index[k] = filter_index;
|
|
return;
|
|
}
|
|
}
|
|
for (int l = 0; l < prelayers[i].layer[j].tree_output.tree.Count; l++)
|
|
{
|
|
for (int k = 0; k < prelayers[i].layer[j].tree_output.tree[l].prefilter.filter_index.Count; k++)
|
|
{
|
|
if (prelayers[i].layer[j].tree_output.tree[l].prefilter.filter_index[k] == filter.Count)
|
|
{
|
|
prelayers[i].layer[j].tree_output.tree[l].prefilter.filter_index[k] = filter_index;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual bool search_filter_index(int filter_index)
|
|
{
|
|
int num = 0;
|
|
int result;
|
|
while (true)
|
|
{
|
|
if (num < prelayers.Count)
|
|
{
|
|
for (int i = 0; i < prelayers[num].layer.Count; i++)
|
|
{
|
|
int num2 = 0;
|
|
while (num2 < prelayers[num].layer[i].prefilter.filter_index.Count)
|
|
{
|
|
if (prelayers[num].layer[i].prefilter.filter_index[num2] != filter_index)
|
|
{
|
|
num2++;
|
|
continue;
|
|
}
|
|
goto IL_0042;
|
|
}
|
|
for (int j = 0; j < prelayers[num].layer[i].tree_output.tree.Count; j++)
|
|
{
|
|
num2 = 0;
|
|
while (num2 < prelayers[num].layer[i].tree_output.tree[j].prefilter.filter_index.Count)
|
|
{
|
|
if (prelayers[num].layer[i].tree_output.tree[j].prefilter.filter_index[num2] != filter_index)
|
|
{
|
|
num2++;
|
|
continue;
|
|
}
|
|
goto IL_00d5;
|
|
}
|
|
}
|
|
}
|
|
num++;
|
|
continue;
|
|
}
|
|
result = 0;
|
|
break;
|
|
IL_00d5:
|
|
filter[filter_index].linked = true;
|
|
result = 1;
|
|
break;
|
|
IL_0042:
|
|
filter[filter_index].linked = true;
|
|
result = 1;
|
|
break;
|
|
}
|
|
return (byte)result != 0;
|
|
}
|
|
|
|
public virtual bool search_subfilter_index(int subfilter_index)
|
|
{
|
|
int num = 0;
|
|
int result;
|
|
while (true)
|
|
{
|
|
if (num < filter.Count)
|
|
{
|
|
int num2 = 0;
|
|
while (num2 < filter[num].presubfilter.subfilter_index.Count)
|
|
{
|
|
if (filter[num].presubfilter.subfilter_index[num2] != subfilter_index)
|
|
{
|
|
num2++;
|
|
continue;
|
|
}
|
|
goto IL_0030;
|
|
}
|
|
num++;
|
|
continue;
|
|
}
|
|
result = 0;
|
|
break;
|
|
IL_0030:
|
|
subfilter[subfilter_index].linked = true;
|
|
result = 1;
|
|
break;
|
|
}
|
|
return (byte)result != 0;
|
|
}
|
|
|
|
public virtual void reset_link_prelayer()
|
|
{
|
|
for (int i = 0; i < prelayers.Count; i++)
|
|
{
|
|
prelayers[i].linked = false;
|
|
}
|
|
}
|
|
|
|
public virtual void reset_link_filter()
|
|
{
|
|
for (int i = 0; i < filter.Count; i++)
|
|
{
|
|
filter[i].linked = false;
|
|
}
|
|
}
|
|
|
|
public virtual void reset_link_subfilter()
|
|
{
|
|
for (int i = 0; i < subfilter.Count; i++)
|
|
{
|
|
subfilter[i].linked = false;
|
|
}
|
|
}
|
|
|
|
public virtual void erase_unlinked_prelayer(bool erase)
|
|
{
|
|
for (int i = 1; i < prelayers.Count; i++)
|
|
{
|
|
if (!prelayers[i].linked)
|
|
{
|
|
if (erase)
|
|
{
|
|
Debug.Log("Erasing unlinked Prelayer -> " + i);
|
|
erase_prelayer(i);
|
|
i--;
|
|
}
|
|
else
|
|
{
|
|
Debug.Log("Unlinked Prelayer -> " + i);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void erase_unlinked_filter(bool erase)
|
|
{
|
|
for (int i = 0; i < filter.Count; i++)
|
|
{
|
|
if (!filter[i].linked)
|
|
{
|
|
if (erase)
|
|
{
|
|
Debug.Log("Erasing unlinked Filter -> " + i);
|
|
erase_filter_unlinked(i);
|
|
i--;
|
|
}
|
|
else
|
|
{
|
|
Debug.Log("Unlinked Filter -> " + i);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void erase_unlinked_subfilter(bool erase)
|
|
{
|
|
for (int i = 0; i < subfilter.Count; i++)
|
|
{
|
|
if (!subfilter[i].linked)
|
|
{
|
|
if (erase)
|
|
{
|
|
Debug.Log("Erasing unlinked Subfilter -> " + i);
|
|
erase_subfilter_unlinked(i);
|
|
i--;
|
|
}
|
|
else
|
|
{
|
|
Debug.Log("Unlinked subfilter -> " + i);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void select_image_prelayer()
|
|
{
|
|
filter_class filter_class2 = null;
|
|
for (int i = 0; i < prelayer.layer.Count; i++)
|
|
{
|
|
for (int j = 0; j < prelayer.layer[i].prefilter.filter_index.Count; j++)
|
|
{
|
|
filter_class2 = filter[prelayer.layer[i].prefilter.filter_index[j]];
|
|
select_image_filter(filter_class2);
|
|
select_image_subfilter(filter_class2);
|
|
}
|
|
if (prelayer.layer[i].output != layer_output_enum.tree)
|
|
{
|
|
continue;
|
|
}
|
|
for (int k = 0; k < prelayer.layer[i].tree_output.tree.Count; k++)
|
|
{
|
|
for (int j = 0; j < prelayer.layer[i].tree_output.tree[k].prefilter.filter_index.Count; j++)
|
|
{
|
|
filter_class2 = filter[prelayer.layer[i].tree_output.tree[k].prefilter.filter_index[j]];
|
|
select_image_filter(filter_class2);
|
|
select_image_subfilter(filter_class2);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void select_image_filter(filter_class current_filter1)
|
|
{
|
|
if (current_filter1.type == condition_type_enum.Image && current_filter1.preimage.image_list_mode == list_condition_enum.Random)
|
|
{
|
|
current_filter1.preimage.image_number = UnityEngine.Random.Range(0, current_filter1.preimage.image.Count - 1);
|
|
}
|
|
}
|
|
|
|
public virtual void select_image_subfilter(filter_class current_filter1)
|
|
{
|
|
subfilter_class subfilter_class2 = null;
|
|
for (int i = 0; i < current_filter1.presubfilter.subfilter_index.Count; i++)
|
|
{
|
|
subfilter_class2 = subfilter[current_filter1.presubfilter.subfilter_index[i]];
|
|
if (subfilter_class2.type == condition_type_enum.Image && subfilter_class2.preimage.image_list_mode == list_condition_enum.Random)
|
|
{
|
|
subfilter_class2.preimage.image_number = UnityEngine.Random.Range(0, subfilter_class2.preimage.image.Count - 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual int search_filter_swap()
|
|
{
|
|
int num = default(int);
|
|
int result;
|
|
while (true)
|
|
{
|
|
if (num < filter.Count)
|
|
{
|
|
if (filter[num].swap_select)
|
|
{
|
|
result = num;
|
|
break;
|
|
}
|
|
num++;
|
|
continue;
|
|
}
|
|
result = -1;
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual int search_filter_copy()
|
|
{
|
|
int num = default(int);
|
|
int result;
|
|
while (true)
|
|
{
|
|
if (num < filter.Count)
|
|
{
|
|
if (filter[num].copy_select)
|
|
{
|
|
result = num;
|
|
break;
|
|
}
|
|
num++;
|
|
continue;
|
|
}
|
|
result = -1;
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual int search_subfilter_swap()
|
|
{
|
|
int num = default(int);
|
|
int result;
|
|
while (true)
|
|
{
|
|
if (num < subfilter.Count)
|
|
{
|
|
if (subfilter[num].swap_select)
|
|
{
|
|
result = num;
|
|
break;
|
|
}
|
|
num++;
|
|
continue;
|
|
}
|
|
result = -1;
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual int search_subfilter_copy()
|
|
{
|
|
int num = default(int);
|
|
int result;
|
|
while (true)
|
|
{
|
|
if (num < subfilter.Count)
|
|
{
|
|
if (subfilter[num].copy_select)
|
|
{
|
|
result = num;
|
|
break;
|
|
}
|
|
num++;
|
|
continue;
|
|
}
|
|
copy_subfilter_select = false;
|
|
result = -1;
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual void search_layer_swap()
|
|
{
|
|
for (int i = 0; i < prelayers.Count; i++)
|
|
{
|
|
for (int j = 0; j < prelayers[i].layer.Count; j++)
|
|
{
|
|
if (prelayers[i].layer[j].swap_select)
|
|
{
|
|
swap_prelayer_index = i;
|
|
swap_layer_index = j;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void search_layer_copy()
|
|
{
|
|
for (int i = 0; i < prelayers.Count; i++)
|
|
{
|
|
for (int j = 0; j < prelayers[i].layer.Count; j++)
|
|
{
|
|
if (prelayers[i].layer[j].copy_select)
|
|
{
|
|
copy_prelayer_index = i;
|
|
copy_layer_index = j;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void search_description_swap()
|
|
{
|
|
for (int i = 0; i < prelayers.Count; i++)
|
|
{
|
|
for (int j = 0; j < prelayers[i].predescription.description.Count; j++)
|
|
{
|
|
if (prelayers[i].predescription.description[j].swap_select)
|
|
{
|
|
swap_description_prelayer_index = i;
|
|
swap_description_position = j;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void search_description_copy()
|
|
{
|
|
for (int i = 0; i < prelayers.Count; i++)
|
|
{
|
|
for (int j = 0; j < prelayers[i].predescription.description.Count; j++)
|
|
{
|
|
if (prelayers[i].predescription.description[j].copy_select)
|
|
{
|
|
copy_description_prelayer_index = i;
|
|
copy_description_position = j;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void search_object_swap()
|
|
{
|
|
for (int i = 0; i < prelayers.Count; i++)
|
|
{
|
|
for (int j = 0; j < prelayers[i].layer.Count; j++)
|
|
{
|
|
for (int k = 0; k < prelayers[i].layer[j].object_output.@object.Count; k++)
|
|
{
|
|
if (prelayers[i].layer[j].object_output.@object[k].swap_select)
|
|
{
|
|
swap_object_output = prelayers[i].layer[j].object_output;
|
|
swap_object_number = k;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual object_class search_object_copy()
|
|
{
|
|
int num = 0;
|
|
object_class result;
|
|
while (true)
|
|
{
|
|
int i;
|
|
int num2;
|
|
if (num < prelayers.Count)
|
|
{
|
|
for (i = 0; i < prelayers[num].layer.Count; i++)
|
|
{
|
|
num2 = 0;
|
|
while (num2 < prelayers[num].layer[i].object_output.@object.Count)
|
|
{
|
|
if (!prelayers[num].layer[i].object_output.@object[num2].copy_select)
|
|
{
|
|
num2++;
|
|
continue;
|
|
}
|
|
goto IL_0046;
|
|
}
|
|
}
|
|
num++;
|
|
continue;
|
|
}
|
|
result = new object_class();
|
|
break;
|
|
IL_0046:
|
|
result = prelayers[num].layer[i].object_output.@object[num2];
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual void search_tree_swap()
|
|
{
|
|
for (int i = 0; i < prelayers.Count; i++)
|
|
{
|
|
for (int j = 0; j < prelayers[i].layer.Count; j++)
|
|
{
|
|
for (int k = 0; k < prelayers[i].layer[j].tree_output.tree.Count; k++)
|
|
{
|
|
if (prelayers[i].layer[j].tree_output.tree[k].swap_select)
|
|
{
|
|
swap_tree_output = prelayers[i].layer[j].tree_output;
|
|
swap_tree_position = k;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual tree_class search_tree_copy()
|
|
{
|
|
int num = 0;
|
|
tree_class result;
|
|
while (true)
|
|
{
|
|
int i;
|
|
int num2;
|
|
if (num < prelayers.Count)
|
|
{
|
|
for (i = 0; i < prelayers[num].layer.Count; i++)
|
|
{
|
|
num2 = 0;
|
|
while (num2 < prelayers[num].layer[i].tree_output.tree.Count)
|
|
{
|
|
if (!prelayers[num].layer[i].tree_output.tree[num2].copy_select)
|
|
{
|
|
num2++;
|
|
continue;
|
|
}
|
|
goto IL_0046;
|
|
}
|
|
}
|
|
num++;
|
|
continue;
|
|
}
|
|
result = new tree_class(script, false);
|
|
break;
|
|
IL_0046:
|
|
result = prelayers[num].layer[i].tree_output.tree[num2];
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual void search_color_range_swap()
|
|
{
|
|
int num = default(int);
|
|
for (int i = 0; i < prelayers.Count; i++)
|
|
{
|
|
for (int j = 0; j < prelayers[i].layer.Count; j++)
|
|
{
|
|
for (int k = 0; k < prelayers[i].layer[j].color_output.precolor_range.Count; k++)
|
|
{
|
|
for (num = 0; num < prelayers[i].layer[j].color_output.precolor_range[k].color_range.Count; num++)
|
|
{
|
|
if (prelayers[i].layer[j].color_output.precolor_range[k].color_range[num].swap_select)
|
|
{
|
|
swap_precolor_range = prelayers[i].layer[j].color_output.precolor_range[k];
|
|
swap_color_range_number = num;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
for (int l = 0; l < prelayers[i].layer[j].tree_output.tree.Count; l++)
|
|
{
|
|
for (num = 0; num < prelayers[i].layer[j].tree_output.tree[l].precolor_range.color_range.Count; num++)
|
|
{
|
|
if (prelayers[i].layer[j].tree_output.tree[l].precolor_range.color_range[num].swap_select)
|
|
{
|
|
swap_precolor_range = prelayers[i].layer[j].tree_output.tree[l].precolor_range;
|
|
swap_color_range_number = num;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for (int m = 0; m < filter.Count; m++)
|
|
{
|
|
for (num = 0; num < filter[m].preimage.precolor_range.color_range.Count; num++)
|
|
{
|
|
if (filter[m].preimage.precolor_range.color_range[num].swap_select)
|
|
{
|
|
swap_precolor_range = filter[m].preimage.precolor_range;
|
|
swap_color_range_number = num;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
for (int n = 0; n < subfilter.Count; n++)
|
|
{
|
|
for (num = 0; num < subfilter[n].preimage.precolor_range.color_range.Count; num++)
|
|
{
|
|
if (subfilter[n].preimage.precolor_range.color_range[num].swap_select)
|
|
{
|
|
swap_precolor_range = subfilter[n].preimage.precolor_range;
|
|
swap_color_range_number = num;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
for (int num2 = 0; num2 < pattern_tool.patterns.Count; num2++)
|
|
{
|
|
for (num = 0; num < pattern_tool.patterns[num2].precolor_range.color_range.Count; num++)
|
|
{
|
|
if (pattern_tool.patterns[num2].precolor_range.color_range[num].swap_select)
|
|
{
|
|
swap_precolor_range = pattern_tool.patterns[num2].precolor_range;
|
|
swap_color_range_number = num;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
for (num = 0; num < texture_tool.precolor_range.color_range.Count; num++)
|
|
{
|
|
if (texture_tool.precolor_range.color_range[num].swap_select)
|
|
{
|
|
swap_precolor_range = texture_tool.precolor_range;
|
|
swap_color_range_number = num;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual color_range_class search_color_range_copy()
|
|
{
|
|
int num = default(int);
|
|
int num2 = 0;
|
|
color_range_class result;
|
|
while (true)
|
|
{
|
|
int i;
|
|
int j;
|
|
int k;
|
|
if (num2 < prelayers.Count)
|
|
{
|
|
for (i = 0; i < prelayers[num2].layer.Count; i++)
|
|
{
|
|
for (j = 0; j < prelayers[num2].layer[i].color_output.precolor_range.Count; j++)
|
|
{
|
|
num = 0;
|
|
while (num < prelayers[num2].layer[i].color_output.precolor_range[j].color_range.Count)
|
|
{
|
|
if (!prelayers[num2].layer[i].color_output.precolor_range[j].color_range[num].copy_select)
|
|
{
|
|
num++;
|
|
continue;
|
|
}
|
|
goto IL_0060;
|
|
}
|
|
}
|
|
for (k = 0; k < prelayers[num2].layer[i].tree_output.tree.Count; k++)
|
|
{
|
|
num = 0;
|
|
while (num < prelayers[num2].layer[i].tree_output.tree[k].precolor_range.color_range.Count)
|
|
{
|
|
if (!prelayers[num2].layer[i].tree_output.tree[k].precolor_range.color_range[num].copy_select)
|
|
{
|
|
num++;
|
|
continue;
|
|
}
|
|
goto IL_0153;
|
|
}
|
|
}
|
|
}
|
|
num2++;
|
|
continue;
|
|
}
|
|
int num3 = 0;
|
|
while (true)
|
|
{
|
|
if (num3 < filter.Count)
|
|
{
|
|
num = 0;
|
|
while (num < filter[num3].preimage.precolor_range.color_range.Count)
|
|
{
|
|
if (!filter[num3].preimage.precolor_range.color_range[num].copy_select)
|
|
{
|
|
num++;
|
|
continue;
|
|
}
|
|
goto IL_0274;
|
|
}
|
|
num3++;
|
|
continue;
|
|
}
|
|
int num4 = 0;
|
|
while (true)
|
|
{
|
|
if (num4 < subfilter.Count)
|
|
{
|
|
num = 0;
|
|
while (num < subfilter[num4].preimage.precolor_range.color_range.Count)
|
|
{
|
|
if (!subfilter[num4].preimage.precolor_range.color_range[num].copy_select)
|
|
{
|
|
num++;
|
|
continue;
|
|
}
|
|
goto IL_0319;
|
|
}
|
|
num4++;
|
|
continue;
|
|
}
|
|
int num5 = 0;
|
|
while (true)
|
|
{
|
|
if (num5 < pattern_tool.patterns.Count)
|
|
{
|
|
num = 0;
|
|
while (num < pattern_tool.patterns[num5].precolor_range.color_range.Count)
|
|
{
|
|
if (!pattern_tool.patterns[num5].precolor_range.color_range[num].copy_select)
|
|
{
|
|
num++;
|
|
continue;
|
|
}
|
|
goto IL_03be;
|
|
}
|
|
num5++;
|
|
continue;
|
|
}
|
|
num = 0;
|
|
while (true)
|
|
{
|
|
if (num < texture_tool.precolor_range.color_range.Count)
|
|
{
|
|
if (texture_tool.precolor_range.color_range[num].copy_select)
|
|
{
|
|
result = texture_tool.precolor_range.color_range[num];
|
|
break;
|
|
}
|
|
num++;
|
|
continue;
|
|
}
|
|
result = new color_range_class();
|
|
break;
|
|
}
|
|
break;
|
|
IL_03be:
|
|
result = pattern_tool.patterns[num5].precolor_range.color_range[num];
|
|
break;
|
|
}
|
|
break;
|
|
IL_0319:
|
|
result = subfilter[num4].preimage.precolor_range.color_range[num];
|
|
break;
|
|
}
|
|
break;
|
|
IL_0274:
|
|
result = filter[num3].preimage.precolor_range.color_range[num];
|
|
break;
|
|
}
|
|
break;
|
|
IL_0153:
|
|
result = prelayers[num2].layer[i].tree_output.tree[k].precolor_range.color_range[num];
|
|
break;
|
|
IL_0060:
|
|
result = prelayers[num2].layer[i].color_output.precolor_range[j].color_range[num];
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual int get_import_resolution_to_list(int resolution)
|
|
{
|
|
int result = -1;
|
|
switch (resolution)
|
|
{
|
|
case 32:
|
|
result = 0;
|
|
break;
|
|
case 64:
|
|
result = 1;
|
|
break;
|
|
case 128:
|
|
result = 2;
|
|
break;
|
|
case 256:
|
|
result = 3;
|
|
break;
|
|
case 512:
|
|
result = 4;
|
|
break;
|
|
case 1024:
|
|
result = 5;
|
|
break;
|
|
case 2048:
|
|
result = 6;
|
|
break;
|
|
case 4096:
|
|
result = 7;
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual int set_import_resolution_from_list(int resolution_index)
|
|
{
|
|
int result = -1;
|
|
switch (resolution_index)
|
|
{
|
|
case 0:
|
|
result = 32;
|
|
break;
|
|
case 1:
|
|
result = 64;
|
|
break;
|
|
case 2:
|
|
result = 128;
|
|
break;
|
|
case 3:
|
|
result = 256;
|
|
break;
|
|
case 4:
|
|
result = 512;
|
|
break;
|
|
case 5:
|
|
result = 1024;
|
|
break;
|
|
case 6:
|
|
result = 2048;
|
|
break;
|
|
case 7:
|
|
result = 4096;
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual void get_terrain_resolution_to_list(terrain_class preterrain1)
|
|
{
|
|
if (preterrain1.heightmap_resolution == 4097f)
|
|
{
|
|
preterrain1.heightmap_resolution_list = 0;
|
|
}
|
|
else if (preterrain1.heightmap_resolution == 2049f)
|
|
{
|
|
preterrain1.heightmap_resolution_list = 1;
|
|
}
|
|
else if (preterrain1.heightmap_resolution == 1025f)
|
|
{
|
|
preterrain1.heightmap_resolution_list = 2;
|
|
}
|
|
else if (preterrain1.heightmap_resolution == 513f)
|
|
{
|
|
preterrain1.heightmap_resolution_list = 3;
|
|
}
|
|
else if (preterrain1.heightmap_resolution == 257f)
|
|
{
|
|
preterrain1.heightmap_resolution_list = 4;
|
|
}
|
|
else if (preterrain1.heightmap_resolution == 129f)
|
|
{
|
|
preterrain1.heightmap_resolution_list = 5;
|
|
}
|
|
else if (preterrain1.heightmap_resolution == 65f)
|
|
{
|
|
preterrain1.heightmap_resolution_list = 6;
|
|
}
|
|
else if (preterrain1.heightmap_resolution == 33f)
|
|
{
|
|
preterrain1.heightmap_resolution_list = 7;
|
|
}
|
|
if (preterrain1.splatmap_resolution == 2048f)
|
|
{
|
|
preterrain1.splatmap_resolution_list = 0;
|
|
}
|
|
else if (preterrain1.splatmap_resolution == 1024f)
|
|
{
|
|
preterrain1.splatmap_resolution_list = 1;
|
|
}
|
|
else if (preterrain1.splatmap_resolution == 512f)
|
|
{
|
|
preterrain1.splatmap_resolution_list = 2;
|
|
}
|
|
else if (preterrain1.splatmap_resolution == 256f)
|
|
{
|
|
preterrain1.splatmap_resolution_list = 3;
|
|
}
|
|
else if (preterrain1.splatmap_resolution == 128f)
|
|
{
|
|
preterrain1.splatmap_resolution_list = 4;
|
|
}
|
|
else if (preterrain1.splatmap_resolution == 64f)
|
|
{
|
|
preterrain1.splatmap_resolution_list = 5;
|
|
}
|
|
else if (preterrain1.splatmap_resolution == 32f)
|
|
{
|
|
preterrain1.splatmap_resolution_list = 6;
|
|
}
|
|
else if (preterrain1.splatmap_resolution == 16f)
|
|
{
|
|
preterrain1.splatmap_resolution_list = 7;
|
|
}
|
|
if (preterrain1.basemap_resolution == 2048f)
|
|
{
|
|
preterrain1.basemap_resolution_list = 0;
|
|
}
|
|
else if (preterrain1.basemap_resolution == 1024f)
|
|
{
|
|
preterrain1.basemap_resolution_list = 1;
|
|
}
|
|
else if (preterrain1.basemap_resolution == 512f)
|
|
{
|
|
preterrain1.basemap_resolution_list = 2;
|
|
}
|
|
else if (preterrain1.basemap_resolution == 256f)
|
|
{
|
|
preterrain1.basemap_resolution_list = 3;
|
|
}
|
|
else if (preterrain1.basemap_resolution == 128f)
|
|
{
|
|
preterrain1.basemap_resolution_list = 4;
|
|
}
|
|
else if (preterrain1.basemap_resolution == 64f)
|
|
{
|
|
preterrain1.basemap_resolution_list = 5;
|
|
}
|
|
else if (preterrain1.basemap_resolution == 32f)
|
|
{
|
|
preterrain1.basemap_resolution_list = 6;
|
|
}
|
|
else if (preterrain1.basemap_resolution == 16f)
|
|
{
|
|
preterrain1.basemap_resolution_list = 7;
|
|
}
|
|
if (preterrain1.detail_resolution_per_patch == 128f)
|
|
{
|
|
preterrain1.detail_resolution_per_patch_list = 4;
|
|
}
|
|
else if (preterrain1.detail_resolution_per_patch == 64f)
|
|
{
|
|
preterrain1.detail_resolution_per_patch_list = 3;
|
|
}
|
|
else if (preterrain1.detail_resolution_per_patch == 32f)
|
|
{
|
|
preterrain1.detail_resolution_per_patch_list = 2;
|
|
}
|
|
else if (preterrain1.detail_resolution_per_patch == 16f)
|
|
{
|
|
preterrain1.detail_resolution_per_patch_list = 1;
|
|
}
|
|
else if (preterrain1.detail_resolution_per_patch == 8f)
|
|
{
|
|
preterrain1.detail_resolution_per_patch_list = 0;
|
|
}
|
|
}
|
|
|
|
public virtual void set_terrain_resolution_from_list(terrain_class preterrain1)
|
|
{
|
|
if (preterrain1.heightmap_resolution_list == 0)
|
|
{
|
|
preterrain1.heightmap_resolution = 4097f;
|
|
}
|
|
else if (preterrain1.heightmap_resolution_list == 1)
|
|
{
|
|
preterrain1.heightmap_resolution = 2049f;
|
|
}
|
|
else if (preterrain1.heightmap_resolution_list == 2)
|
|
{
|
|
preterrain1.heightmap_resolution = 1025f;
|
|
}
|
|
else if (preterrain1.heightmap_resolution_list == 3)
|
|
{
|
|
preterrain1.heightmap_resolution = 513f;
|
|
}
|
|
else if (preterrain1.heightmap_resolution_list == 4)
|
|
{
|
|
preterrain1.heightmap_resolution = 257f;
|
|
}
|
|
else if (preterrain1.heightmap_resolution_list == 5)
|
|
{
|
|
preterrain1.heightmap_resolution = 129f;
|
|
}
|
|
else if (preterrain1.heightmap_resolution_list == 6)
|
|
{
|
|
preterrain1.heightmap_resolution = 65f;
|
|
}
|
|
else if (preterrain1.heightmap_resolution_list == 7)
|
|
{
|
|
preterrain1.heightmap_resolution = 33f;
|
|
}
|
|
if (preterrain1.splatmap_resolution_list == 0)
|
|
{
|
|
preterrain1.splatmap_resolution = 2048f;
|
|
}
|
|
else if (preterrain1.splatmap_resolution_list == 1)
|
|
{
|
|
preterrain1.splatmap_resolution = 1024f;
|
|
}
|
|
else if (preterrain1.splatmap_resolution_list == 2)
|
|
{
|
|
preterrain1.splatmap_resolution = 512f;
|
|
}
|
|
else if (preterrain1.splatmap_resolution_list == 3)
|
|
{
|
|
preterrain1.splatmap_resolution = 256f;
|
|
}
|
|
else if (preterrain1.splatmap_resolution_list == 4)
|
|
{
|
|
preterrain1.splatmap_resolution = 128f;
|
|
}
|
|
else if (preterrain1.splatmap_resolution_list == 5)
|
|
{
|
|
preterrain1.splatmap_resolution = 64f;
|
|
}
|
|
else if (preterrain1.splatmap_resolution_list == 6)
|
|
{
|
|
preterrain1.splatmap_resolution = 32f;
|
|
}
|
|
else if (preterrain1.splatmap_resolution_list == 7)
|
|
{
|
|
preterrain1.splatmap_resolution = 16f;
|
|
}
|
|
if (preterrain1.basemap_resolution_list == 0)
|
|
{
|
|
preterrain1.basemap_resolution = 2048f;
|
|
}
|
|
else if (preterrain1.basemap_resolution_list == 1)
|
|
{
|
|
preterrain1.basemap_resolution = 1024f;
|
|
}
|
|
else if (preterrain1.basemap_resolution_list == 2)
|
|
{
|
|
preterrain1.basemap_resolution = 512f;
|
|
}
|
|
else if (preterrain1.basemap_resolution_list == 3)
|
|
{
|
|
preterrain1.basemap_resolution = 256f;
|
|
}
|
|
else if (preterrain1.basemap_resolution_list == 4)
|
|
{
|
|
preterrain1.basemap_resolution = 128f;
|
|
}
|
|
else if (preterrain1.basemap_resolution_list == 5)
|
|
{
|
|
preterrain1.basemap_resolution = 64f;
|
|
}
|
|
else if (preterrain1.basemap_resolution_list == 6)
|
|
{
|
|
preterrain1.basemap_resolution = 32f;
|
|
}
|
|
else if (preterrain1.basemap_resolution_list == 7)
|
|
{
|
|
preterrain1.basemap_resolution = 16f;
|
|
}
|
|
if (preterrain1.detail_resolution_per_patch_list == 0)
|
|
{
|
|
preterrain1.detail_resolution_per_patch = 8f;
|
|
}
|
|
else if (preterrain1.detail_resolution_per_patch_list == 1)
|
|
{
|
|
preterrain1.detail_resolution_per_patch = 16f;
|
|
}
|
|
else if (preterrain1.detail_resolution_per_patch_list == 2)
|
|
{
|
|
preterrain1.detail_resolution_per_patch = 32f;
|
|
}
|
|
else if (preterrain1.detail_resolution_per_patch_list == 3)
|
|
{
|
|
preterrain1.detail_resolution_per_patch = 64f;
|
|
}
|
|
else if (preterrain1.detail_resolution_per_patch_list == 4)
|
|
{
|
|
preterrain1.detail_resolution_per_patch = 128f;
|
|
}
|
|
}
|
|
|
|
public virtual void get_terrains_position()
|
|
{
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
terrains[i].rect.x = terrains[i].terrain.transform.position.x;
|
|
terrains[i].rect.y = terrains[i].terrain.transform.position.z;
|
|
terrains[i].rect.width = terrains[i].terrain.terrainData.size.x;
|
|
terrains[i].rect.height = terrains[i].terrain.terrainData.size.z;
|
|
}
|
|
if (slice_tool && (bool)slice_tool_terrain)
|
|
{
|
|
slice_tool_rect.x = slice_tool_terrain.transform.position.x;
|
|
slice_tool_rect.y = slice_tool_terrain.transform.position.z;
|
|
slice_tool_rect.width = slice_tool_terrain.terrainData.size.x;
|
|
slice_tool_rect.height = slice_tool_terrain.terrainData.size.z;
|
|
}
|
|
}
|
|
|
|
public virtual void set_basemap_max(bool editor)
|
|
{
|
|
if (terrains.Count > 1)
|
|
{
|
|
if (editor)
|
|
{
|
|
settings.editor_basemap_distance_max = (int)(terrains[0].tiles.x * terrains[0].size.x);
|
|
}
|
|
else
|
|
{
|
|
settings.runtime_basemap_distance_max = (int)(terrains[0].tiles.x * terrains[0].size.x);
|
|
}
|
|
}
|
|
else if (editor)
|
|
{
|
|
settings.editor_basemap_distance_max = (int)terrains[0].size.x;
|
|
}
|
|
else
|
|
{
|
|
settings.runtime_basemap_distance_max = (int)terrains[0].size.x;
|
|
}
|
|
}
|
|
|
|
public virtual void get_all_terrain_settings(string command)
|
|
{
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
get_terrain_settings(terrains[i], command);
|
|
check_synchronous_terrain_size(terrains[i]);
|
|
}
|
|
}
|
|
|
|
public virtual void get_terrain_settings(terrain_class preterrain1, string command)
|
|
{
|
|
if ((bool)preterrain1.terrain && (bool)preterrain1.terrain.terrainData)
|
|
{
|
|
bool flag = false;
|
|
bool flag2 = false;
|
|
bool flag3 = false;
|
|
bool flag4 = false;
|
|
bool flag5 = false;
|
|
bool flag6 = false;
|
|
bool flag7 = false;
|
|
bool flag8 = false;
|
|
if (command.IndexOf("(siz)") != -1)
|
|
{
|
|
flag = true;
|
|
}
|
|
if (command.IndexOf("(res)") != -1)
|
|
{
|
|
flag2 = true;
|
|
}
|
|
if (command.IndexOf("(con)") != -1)
|
|
{
|
|
flag3 = true;
|
|
}
|
|
if (command.IndexOf("(all)") != -1)
|
|
{
|
|
flag4 = true;
|
|
}
|
|
if (command.IndexOf("(fir)") != -1)
|
|
{
|
|
flag5 = true;
|
|
}
|
|
if (command.IndexOf("(spl)") != -1)
|
|
{
|
|
flag6 = true;
|
|
}
|
|
if (command.IndexOf("(tre)") != -1)
|
|
{
|
|
flag7 = true;
|
|
}
|
|
if (command.IndexOf("(gra)") != -1)
|
|
{
|
|
flag8 = true;
|
|
}
|
|
preterrain1.splat_length = preterrain1.terrain.terrainData.splatPrototypes.Length;
|
|
preterrain1.name = preterrain1.terrain.name;
|
|
if (flag || flag4)
|
|
{
|
|
preterrain1.size = preterrain1.terrain.terrainData.size;
|
|
check_synchronous_terrain_size(preterrain1);
|
|
preterrain1.scale.x = preterrain1.size.x / (float)preterrain1.terrain.terrainData.heightmapResolution;
|
|
preterrain1.scale.y = preterrain1.size.y / (float)preterrain1.terrain.terrainData.heightmapResolution;
|
|
preterrain1.scale.z = preterrain1.size.z / (float)preterrain1.terrain.terrainData.heightmapResolution;
|
|
}
|
|
if (flag2 || flag4)
|
|
{
|
|
preterrain1.heightmap_resolution = preterrain1.terrain.terrainData.heightmapResolution;
|
|
preterrain1.splatmap_resolution = preterrain1.terrain.terrainData.alphamapResolution;
|
|
preterrain1.detail_resolution = preterrain1.terrain.terrainData.detailResolution;
|
|
preterrain1.basemap_resolution = preterrain1.terrain.terrainData.baseMapResolution;
|
|
get_terrain_resolution_to_list(preterrain1);
|
|
check_synchronous_terrain_resolutions(preterrain1);
|
|
}
|
|
if (flag3 || flag4)
|
|
{
|
|
preterrain1.heightmap_conversion.x = preterrain1.terrain.terrainData.size.x / (float)(preterrain1.terrain.terrainData.heightmapResolution - 1);
|
|
preterrain1.heightmap_conversion.y = preterrain1.terrain.terrainData.size.z / (float)(preterrain1.terrain.terrainData.heightmapResolution - 1);
|
|
preterrain1.splatmap_conversion.x = preterrain1.terrain.terrainData.size.x / (float)(preterrain1.terrain.terrainData.alphamapResolution - 1);
|
|
preterrain1.splatmap_conversion.y = preterrain1.terrain.terrainData.size.z / (float)(preterrain1.terrain.terrainData.alphamapResolution - 1);
|
|
preterrain1.detailmap_conversion.x = preterrain1.terrain.terrainData.size.x / (float)(preterrain1.terrain.terrainData.detailResolution - 1);
|
|
preterrain1.detailmap_conversion.y = preterrain1.terrain.terrainData.size.z / (float)(preterrain1.terrain.terrainData.detailResolution - 1);
|
|
set_area_resolution(preterrain1, preterrain1.prearea);
|
|
}
|
|
if (flag5)
|
|
{
|
|
preterrain1.prearea.area_max = new Rect(0f, 0f, preterrain1.terrain.terrainData.size.x, preterrain1.terrain.terrainData.size.z);
|
|
preterrain1.prearea.area = preterrain1.prearea.area_max;
|
|
preterrain1.prearea.set_resolution_mode_text();
|
|
get_terrain_parameter_settings(preterrain1);
|
|
}
|
|
if (flag || flag4 || flag3 || flag2 || flag5)
|
|
{
|
|
set_area_resolution(preterrain1, preterrain1.prearea);
|
|
set_area_resolution_prelayers(preterrain1);
|
|
}
|
|
if (!(preterrain1.prearea.area.xMax <= preterrain1.terrain.terrainData.size.x))
|
|
{
|
|
preterrain1.prearea.area.xMax = preterrain1.terrain.terrainData.size.x;
|
|
}
|
|
if (!(preterrain1.prearea.area.yMax <= preterrain1.terrain.terrainData.size.y))
|
|
{
|
|
preterrain1.prearea.area.yMax = preterrain1.terrain.terrainData.size.z;
|
|
}
|
|
if (flag6)
|
|
{
|
|
get_terrain_splat_textures(preterrain1);
|
|
check_synchronous_terrain_splat_textures(preterrain1);
|
|
}
|
|
if (flag7)
|
|
{
|
|
get_terrain_trees(preterrain1);
|
|
check_synchronous_terrain_trees(preterrain1);
|
|
}
|
|
if (flag8)
|
|
{
|
|
get_terrain_details(preterrain1);
|
|
check_synchronous_terrain_detail(preterrain1);
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_area_resolution_prelayers(terrain_class preterrain1)
|
|
{
|
|
for (int i = 0; i < prelayers.Count; i++)
|
|
{
|
|
set_area_resolution(preterrain1, prelayers[i].prearea);
|
|
}
|
|
}
|
|
|
|
public virtual void set_area_resolution(area_class prearea)
|
|
{
|
|
prearea.step.x = object_resolution;
|
|
prearea.step.y = object_resolution;
|
|
prearea.conversion_step = prearea.step;
|
|
prearea.resolution = object_resolution;
|
|
}
|
|
|
|
public virtual void set_area_resolution(terrain_class preterrain1, area_class prearea)
|
|
{
|
|
if ((bool)preterrain1.terrain && (bool)preterrain1.terrain.terrainData)
|
|
{
|
|
if (prearea.resolution_mode == resolution_mode_enum.Heightmap)
|
|
{
|
|
prearea.step.x = preterrain1.terrain.terrainData.size.x / (float)(preterrain1.terrain.terrainData.heightmapResolution - 1);
|
|
prearea.step.y = preterrain1.terrain.terrainData.size.z / (float)(preterrain1.terrain.terrainData.heightmapResolution - 1);
|
|
prearea.conversion_step = prearea.step;
|
|
prearea.resolution = preterrain1.heightmap_resolution;
|
|
}
|
|
else if (prearea.resolution_mode == resolution_mode_enum.Colormap)
|
|
{
|
|
prearea.step.x = preterrain1.terrain.terrainData.size.x / (float)colormap_resolution;
|
|
prearea.step.y = preterrain1.terrain.terrainData.size.z / (float)colormap_resolution;
|
|
preterrain1.splatmap_conversion.x = preterrain1.terrain.terrainData.size.x / (float)(colormap_resolution - 1);
|
|
preterrain1.splatmap_conversion.y = preterrain1.terrain.terrainData.size.z / (float)(colormap_resolution - 1);
|
|
preterrain1.splatmap_resolution = colormap_resolution;
|
|
prearea.conversion_step = prearea.step;
|
|
prearea.resolution = colormap_resolution;
|
|
}
|
|
else if (prearea.resolution_mode == resolution_mode_enum.Splatmap)
|
|
{
|
|
prearea.step.x = preterrain1.terrain.terrainData.size.x / (float)preterrain1.terrain.terrainData.alphamapResolution;
|
|
prearea.step.y = preterrain1.terrain.terrainData.size.z / (float)preterrain1.terrain.terrainData.alphamapResolution;
|
|
prearea.conversion_step = prearea.step;
|
|
prearea.resolution = preterrain1.splatmap_resolution;
|
|
}
|
|
else if (prearea.resolution_mode == resolution_mode_enum.Detailmap)
|
|
{
|
|
prearea.step.x = preterrain1.terrain.terrainData.size.x / (float)preterrain1.terrain.terrainData.detailResolution;
|
|
prearea.step.y = preterrain1.terrain.terrainData.size.z / (float)preterrain1.terrain.terrainData.detailResolution;
|
|
prearea.conversion_step = prearea.step;
|
|
prearea.resolution = preterrain1.detail_resolution;
|
|
}
|
|
else if (prearea.resolution_mode == resolution_mode_enum.Tree)
|
|
{
|
|
prearea.step.x = preterrain1.terrain.terrainData.size.x / (float)prearea.tree_resolution;
|
|
prearea.step.y = preterrain1.terrain.terrainData.size.z / (float)prearea.tree_resolution;
|
|
prearea.conversion_step = prearea.step;
|
|
prearea.resolution = prearea.tree_resolution;
|
|
}
|
|
else if (prearea.resolution_mode == resolution_mode_enum.Object)
|
|
{
|
|
prearea.step.x = preterrain1.terrain.terrainData.size.x / (float)prearea.object_resolution;
|
|
prearea.step.y = preterrain1.terrain.terrainData.size.z / (float)prearea.object_resolution;
|
|
prearea.conversion_step = prearea.step;
|
|
prearea.resolution = prearea.object_resolution;
|
|
}
|
|
else if (prearea.resolution_mode == resolution_mode_enum.Units)
|
|
{
|
|
prearea.step.x = 1f;
|
|
prearea.step.y = 1f;
|
|
prearea.conversion_step = prearea.step;
|
|
prearea.resolution = preterrain1.terrain.terrainData.size.x;
|
|
}
|
|
else if (prearea.resolution_mode == resolution_mode_enum.Custom)
|
|
{
|
|
prearea.resolution = preterrain1.terrain.terrainData.size.x / prearea.step.x;
|
|
prearea.conversion_step = prearea.step;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void get_terrain_parameter_settings(terrain_class preterrain1)
|
|
{
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
terrains[i].settings_editor = preterrain1.settings_editor;
|
|
terrains[i].settings_runtime = preterrain1.settings_runtime;
|
|
if (!terrains[i].terrain || !terrains[i].terrain.terrainData)
|
|
{
|
|
continue;
|
|
}
|
|
if (terrains[i].settings_editor)
|
|
{
|
|
terrains[i].heightmapPixelError = terrains[i].terrain.heightmapPixelError;
|
|
terrains[i].heightmapMaximumLOD = terrains[i].terrain.heightmapMaximumLOD;
|
|
terrains[i].basemapDistance = terrains[i].terrain.basemapDistance;
|
|
terrains[i].castShadows = terrains[i].terrain.castShadows;
|
|
terrains[i].draw = terrains[i].editor_draw;
|
|
terrains[i].treeDistance = terrains[i].terrain.treeDistance;
|
|
terrains[i].detailObjectDistance = terrains[i].terrain.detailObjectDistance;
|
|
terrains[i].detailObjectDensity = terrains[i].terrain.detailObjectDensity;
|
|
terrains[i].treeBillboardDistance = terrains[i].terrain.treeBillboardDistance;
|
|
terrains[i].treeCrossFadeLength = terrains[i].terrain.treeCrossFadeLength;
|
|
terrains[i].treeMaximumFullLODCount = terrains[i].terrain.treeMaximumFullLODCount;
|
|
continue;
|
|
}
|
|
terrains[i].script_terrainDetail = (TerrainDetail)terrains[i].terrain.gameObject.GetComponent(typeof(TerrainDetail));
|
|
if (!terrains[i].script_terrainDetail)
|
|
{
|
|
terrains[i].script_terrainDetail = (TerrainDetail)terrains[i].terrain.gameObject.AddComponent(typeof(TerrainDetail));
|
|
}
|
|
terrains[i].heightmapPixelError = terrains[i].script_terrainDetail.heightmapPixelError;
|
|
terrains[i].heightmapMaximumLOD = terrains[i].script_terrainDetail.heightmapMaximumLOD;
|
|
terrains[i].basemapDistance = terrains[i].script_terrainDetail.basemapDistance;
|
|
terrains[i].castShadows = terrains[i].script_terrainDetail.castShadows;
|
|
terrains[i].draw = terrains[i].script_terrainDetail.draw;
|
|
terrains[i].treeDistance = terrains[i].script_terrainDetail.treeDistance;
|
|
terrains[i].detailObjectDistance = terrains[i].script_terrainDetail.detailObjectDistance;
|
|
terrains[i].detailObjectDensity = terrains[i].script_terrainDetail.detailObjectDensity;
|
|
terrains[i].treeBillboardDistance = terrains[i].script_terrainDetail.treeBillboardDistance;
|
|
terrains[i].treeCrossFadeLength = terrains[i].script_terrainDetail.treeCrossFadeLength;
|
|
terrains[i].treeMaximumFullLODCount = terrains[i].script_terrainDetail.treeMaximumFullLODCount;
|
|
}
|
|
}
|
|
|
|
public virtual void set_terrain_parameters(terrain_class preterrain1, terrain_class preterrain2)
|
|
{
|
|
preterrain1.terrain.heightmapPixelError = preterrain2.heightmapPixelError;
|
|
preterrain1.terrain.heightmapMaximumLOD = preterrain2.heightmapMaximumLOD;
|
|
preterrain1.terrain.basemapDistance = preterrain2.basemapDistance;
|
|
preterrain1.terrain.castShadows = preterrain2.castShadows;
|
|
preterrain1.terrain.treeDistance = preterrain2.treeDistance;
|
|
preterrain1.terrain.detailObjectDistance = preterrain2.detailObjectDistance;
|
|
preterrain1.terrain.detailObjectDensity = preterrain2.detailObjectDensity;
|
|
preterrain1.terrain.treeBillboardDistance = preterrain2.treeBillboardDistance;
|
|
preterrain1.terrain.treeCrossFadeLength = preterrain2.treeCrossFadeLength;
|
|
preterrain1.terrain.treeMaximumFullLODCount = preterrain2.treeMaximumFullLODCount;
|
|
}
|
|
|
|
public virtual void set_terrain_pixelerror(terrain_class preterrain1, bool all_terrain)
|
|
{
|
|
if (!all_terrain)
|
|
{
|
|
if ((bool)preterrain1.terrain)
|
|
{
|
|
if (preterrain1.settings_editor)
|
|
{
|
|
preterrain1.terrain.heightmapPixelError = preterrain1.heightmapPixelError;
|
|
}
|
|
else
|
|
{
|
|
preterrain1.script_terrainDetail.heightmapPixelError = preterrain1.heightmapPixelError;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if ((bool)terrains[i].terrain)
|
|
{
|
|
terrains[i].heightmapPixelError = preterrain1.heightmapPixelError;
|
|
if (preterrain1.settings_editor)
|
|
{
|
|
terrains[i].terrain.heightmapPixelError = preterrain1.heightmapPixelError;
|
|
}
|
|
else
|
|
{
|
|
terrains[i].script_terrainDetail.heightmapPixelError = preterrain1.heightmapPixelError;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_terrain_heightmap_lod(terrain_class preterrain1, bool all_terrain)
|
|
{
|
|
if (!all_terrain)
|
|
{
|
|
if ((bool)preterrain1.terrain)
|
|
{
|
|
if (preterrain1.settings_editor)
|
|
{
|
|
preterrain1.terrain.heightmapMaximumLOD = preterrain1.heightmapMaximumLOD;
|
|
}
|
|
else
|
|
{
|
|
preterrain1.script_terrainDetail.heightmapMaximumLOD = preterrain1.heightmapMaximumLOD;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if ((bool)terrains[i].terrain)
|
|
{
|
|
terrains[i].heightmapMaximumLOD = preterrain1.heightmapMaximumLOD;
|
|
if (preterrain1.settings_editor)
|
|
{
|
|
terrains[i].terrain.heightmapMaximumLOD = preterrain1.heightmapMaximumLOD;
|
|
}
|
|
else
|
|
{
|
|
terrains[i].script_terrainDetail.heightmapMaximumLOD = preterrain1.heightmapMaximumLOD;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_terrain_draw(terrain_class preterrain1, bool all_terrain, bool draw)
|
|
{
|
|
if (!all_terrain)
|
|
{
|
|
if (!preterrain1.terrain)
|
|
{
|
|
return;
|
|
}
|
|
if (draw)
|
|
{
|
|
if (preterrain1.settings_editor)
|
|
{
|
|
preterrain1.terrain.detailObjectDistance = preterrain1.detailObjectDistance;
|
|
preterrain1.terrain.treeDistance = preterrain1.treeDistance;
|
|
preterrain1.editor_draw = true;
|
|
}
|
|
else
|
|
{
|
|
preterrain1.script_terrainDetail.draw = true;
|
|
}
|
|
}
|
|
else if (preterrain1.settings_editor)
|
|
{
|
|
preterrain1.terrain.detailObjectDistance = 0f;
|
|
preterrain1.terrain.treeDistance = 0f;
|
|
preterrain1.editor_draw = false;
|
|
}
|
|
else
|
|
{
|
|
preterrain1.script_terrainDetail.draw = false;
|
|
}
|
|
return;
|
|
}
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if (!terrains[i].terrain)
|
|
{
|
|
continue;
|
|
}
|
|
if (draw)
|
|
{
|
|
if (preterrain1.settings_editor)
|
|
{
|
|
terrains[i].terrain.detailObjectDistance = preterrain1.detailObjectDistance;
|
|
terrains[i].terrain.treeDistance = preterrain1.treeDistance;
|
|
terrains[i].editor_draw = true;
|
|
}
|
|
else
|
|
{
|
|
terrains[i].script_terrainDetail.draw = true;
|
|
}
|
|
}
|
|
else if (preterrain1.settings_editor)
|
|
{
|
|
terrains[i].terrain.detailObjectDistance = 0f;
|
|
terrains[i].terrain.treeDistance = 0f;
|
|
terrains[i].editor_draw = false;
|
|
}
|
|
else
|
|
{
|
|
terrains[i].script_terrainDetail.draw = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_terrain_basemap_distance(terrain_class preterrain1, bool all_terrain)
|
|
{
|
|
if (!all_terrain)
|
|
{
|
|
if ((bool)preterrain1.terrain)
|
|
{
|
|
if (preterrain1.settings_editor)
|
|
{
|
|
preterrain1.terrain.basemapDistance = preterrain1.basemapDistance;
|
|
}
|
|
else
|
|
{
|
|
preterrain1.script_terrainDetail.basemapDistance = preterrain1.basemapDistance;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if ((bool)terrains[i].terrain)
|
|
{
|
|
terrains[i].basemapDistance = preterrain1.basemapDistance;
|
|
if (preterrain1.settings_editor)
|
|
{
|
|
terrains[i].terrain.basemapDistance = preterrain1.basemapDistance;
|
|
}
|
|
else
|
|
{
|
|
terrains[i].script_terrainDetail.basemapDistance = preterrain1.basemapDistance;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_terrain_detail_distance(terrain_class preterrain1, bool all_terrain)
|
|
{
|
|
if (!all_terrain)
|
|
{
|
|
if ((bool)preterrain1.terrain)
|
|
{
|
|
if (preterrain1.settings_editor)
|
|
{
|
|
preterrain1.terrain.detailObjectDistance = preterrain1.detailObjectDistance;
|
|
}
|
|
else
|
|
{
|
|
preterrain1.script_terrainDetail.detailObjectDistance = preterrain1.detailObjectDistance;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
terrains[i].detailObjectDistance = preterrain1.detailObjectDistance;
|
|
if ((bool)terrains[i].terrain)
|
|
{
|
|
if (preterrain1.settings_editor)
|
|
{
|
|
terrains[i].terrain.detailObjectDistance = preterrain1.detailObjectDistance;
|
|
}
|
|
else
|
|
{
|
|
terrains[i].script_terrainDetail.detailObjectDistance = preterrain1.detailObjectDistance;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_terrain_detail_density(terrain_class preterrain1, bool all_terrain)
|
|
{
|
|
if (!all_terrain)
|
|
{
|
|
if ((bool)preterrain1.terrain)
|
|
{
|
|
if (preterrain1.settings_editor)
|
|
{
|
|
preterrain1.terrain.detailObjectDensity = preterrain1.detailObjectDensity;
|
|
}
|
|
else
|
|
{
|
|
preterrain1.script_terrainDetail.detailObjectDensity = preterrain1.detailObjectDensity;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if ((bool)terrains[i].terrain)
|
|
{
|
|
terrains[i].detailObjectDensity = preterrain1.detailObjectDensity;
|
|
if (preterrain1.settings_editor)
|
|
{
|
|
terrains[i].terrain.detailObjectDensity = preterrain1.detailObjectDensity;
|
|
}
|
|
else
|
|
{
|
|
terrains[i].script_terrainDetail.detailObjectDensity = preterrain1.detailObjectDensity;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_terrain_tree_distance(terrain_class preterrain1, bool all_terrain)
|
|
{
|
|
if (!all_terrain)
|
|
{
|
|
if ((bool)preterrain1.terrain)
|
|
{
|
|
if (preterrain1.settings_editor)
|
|
{
|
|
preterrain1.terrain.treeDistance = preterrain1.treeDistance;
|
|
}
|
|
else
|
|
{
|
|
preterrain1.script_terrainDetail.treeDistance = preterrain1.treeDistance;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
terrains[i].treeDistance = preterrain1.treeDistance;
|
|
if ((bool)terrains[i].terrain)
|
|
{
|
|
if (preterrain1.settings_editor)
|
|
{
|
|
terrains[i].terrain.treeDistance = preterrain1.treeDistance;
|
|
}
|
|
else
|
|
{
|
|
terrains[i].script_terrainDetail.treeDistance = preterrain1.treeDistance;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_terrain_tree_billboard_distance(terrain_class preterrain1, bool all_terrain)
|
|
{
|
|
if (!all_terrain)
|
|
{
|
|
if ((bool)preterrain1.terrain)
|
|
{
|
|
if (preterrain1.settings_editor)
|
|
{
|
|
preterrain1.terrain.treeBillboardDistance = preterrain1.treeBillboardDistance;
|
|
}
|
|
else
|
|
{
|
|
preterrain1.script_terrainDetail.treeBillboardDistance = preterrain1.treeBillboardDistance;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
terrains[i].treeBillboardDistance = preterrain1.treeBillboardDistance;
|
|
if ((bool)terrains[i].terrain)
|
|
{
|
|
if (preterrain1.settings_editor)
|
|
{
|
|
terrains[i].terrain.treeBillboardDistance = preterrain1.treeBillboardDistance;
|
|
}
|
|
else
|
|
{
|
|
terrains[i].script_terrainDetail.treeBillboardDistance = preterrain1.treeBillboardDistance;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_terrain_tree_billboard_fade_length(terrain_class preterrain1, bool all_terrain)
|
|
{
|
|
if (!all_terrain)
|
|
{
|
|
if ((bool)preterrain1.terrain)
|
|
{
|
|
if (preterrain1.settings_editor)
|
|
{
|
|
preterrain1.terrain.treeCrossFadeLength = preterrain1.treeCrossFadeLength;
|
|
}
|
|
else
|
|
{
|
|
preterrain1.script_terrainDetail.treeCrossFadeLength = preterrain1.treeCrossFadeLength;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if ((bool)terrains[i].terrain)
|
|
{
|
|
terrains[i].treeCrossFadeLength = preterrain1.treeCrossFadeLength;
|
|
if (preterrain1.settings_editor)
|
|
{
|
|
terrains[i].terrain.treeCrossFadeLength = preterrain1.treeCrossFadeLength;
|
|
}
|
|
else
|
|
{
|
|
terrains[i].script_terrainDetail.treeCrossFadeLength = preterrain1.treeCrossFadeLength;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_terrain_tree_max_mesh(terrain_class preterrain1, bool all_terrain)
|
|
{
|
|
if (!all_terrain)
|
|
{
|
|
if ((bool)preterrain1.terrain)
|
|
{
|
|
if (preterrain1.settings_editor)
|
|
{
|
|
preterrain1.terrain.treeMaximumFullLODCount = preterrain1.treeMaximumFullLODCount;
|
|
}
|
|
else
|
|
{
|
|
preterrain1.script_terrainDetail.treeMaximumFullLODCount = preterrain1.treeMaximumFullLODCount;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
terrains[i].treeMaximumFullLODCount = preterrain1.treeMaximumFullLODCount;
|
|
if ((bool)terrains[i].terrain)
|
|
{
|
|
if (preterrain1.settings_editor)
|
|
{
|
|
terrains[i].terrain.treeMaximumFullLODCount = preterrain1.treeMaximumFullLODCount;
|
|
}
|
|
else
|
|
{
|
|
terrains[i].script_terrainDetail.treeMaximumFullLODCount = preterrain1.treeMaximumFullLODCount;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_terrain_shadow(terrain_class preterrain1, bool all_terrain)
|
|
{
|
|
if (!all_terrain)
|
|
{
|
|
if ((bool)preterrain1.terrain)
|
|
{
|
|
if (preterrain1.settings_editor)
|
|
{
|
|
preterrain1.terrain.castShadows = preterrain1.castShadows;
|
|
}
|
|
else
|
|
{
|
|
preterrain1.script_terrainDetail.castShadows = preterrain1.castShadows;
|
|
}
|
|
}
|
|
return;
|
|
}
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
terrains[i].castShadows = preterrain1.castShadows;
|
|
if ((bool)terrains[i].terrain)
|
|
{
|
|
if (preterrain1.settings_editor)
|
|
{
|
|
terrains[i].terrain.castShadows = preterrain1.castShadows;
|
|
}
|
|
else
|
|
{
|
|
terrains[i].script_terrainDetail.castShadows = preterrain1.castShadows;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_terrain_material(terrain_class preterrain1, bool all_terrain)
|
|
{
|
|
if (!all_terrain)
|
|
{
|
|
return;
|
|
}
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if ((bool)terrains[i].terrain)
|
|
{
|
|
terrains[i].terrain.materialTemplate = preterrain1.terrain.materialTemplate;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_terrain_wind_speed(terrain_class preterrain1, bool all_terrain)
|
|
{
|
|
if (!all_terrain)
|
|
{
|
|
if ((bool)preterrain1.terrain)
|
|
{
|
|
preterrain1.terrain.terrainData.wavingGrassSpeed = preterrain1.wavingGrassSpeed;
|
|
}
|
|
return;
|
|
}
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if ((bool)terrains[i].terrain)
|
|
{
|
|
terrains[i].terrain.terrainData.wavingGrassSpeed = preterrain1.wavingGrassSpeed;
|
|
terrains[i].wavingGrassSpeed = preterrain1.wavingGrassSpeed;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_terrain_wind_amount(terrain_class preterrain1, bool all_terrain)
|
|
{
|
|
if (!all_terrain)
|
|
{
|
|
if ((bool)preterrain1.terrain)
|
|
{
|
|
preterrain1.terrain.terrainData.wavingGrassAmount = preterrain1.wavingGrassAmount;
|
|
}
|
|
return;
|
|
}
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if ((bool)terrains[i].terrain)
|
|
{
|
|
terrains[i].terrain.terrainData.wavingGrassAmount = preterrain1.wavingGrassAmount;
|
|
terrains[i].wavingGrassAmount = preterrain1.wavingGrassAmount;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_terrain_wind_bending(terrain_class preterrain1, bool all_terrain)
|
|
{
|
|
if (!all_terrain)
|
|
{
|
|
if ((bool)preterrain1.terrain)
|
|
{
|
|
preterrain1.terrain.terrainData.wavingGrassStrength = preterrain1.wavingGrassStrength;
|
|
}
|
|
return;
|
|
}
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if ((bool)terrains[i].terrain)
|
|
{
|
|
terrains[i].terrain.terrainData.wavingGrassStrength = preterrain1.wavingGrassStrength;
|
|
terrains[i].wavingGrassStrength = preterrain1.wavingGrassStrength;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_terrain_grass_tint(terrain_class preterrain1, bool all_terrain)
|
|
{
|
|
if (!all_terrain)
|
|
{
|
|
if ((bool)preterrain1.terrain)
|
|
{
|
|
preterrain1.terrain.terrainData.wavingGrassTint = preterrain1.wavingGrassTint;
|
|
}
|
|
return;
|
|
}
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if ((bool)terrains[i].terrain)
|
|
{
|
|
terrains[i].terrain.terrainData.wavingGrassTint = preterrain1.wavingGrassTint;
|
|
terrains[i].wavingGrassTint = preterrain1.wavingGrassTint;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_terrain_settings(terrain_class preterrain1, string command)
|
|
{
|
|
if (!preterrain1.terrain)
|
|
{
|
|
return;
|
|
}
|
|
bool flag = false;
|
|
bool flag2 = false;
|
|
bool flag3 = false;
|
|
if (command.IndexOf("(siz)") != -1)
|
|
{
|
|
flag = true;
|
|
}
|
|
if (command.IndexOf("(res)") != -1)
|
|
{
|
|
flag3 = true;
|
|
}
|
|
if (command.IndexOf("(all)") != -1)
|
|
{
|
|
flag2 = true;
|
|
}
|
|
if (flag3 || flag2)
|
|
{
|
|
if ((float)preterrain1.terrain.terrainData.heightmapResolution != preterrain1.heightmap_resolution)
|
|
{
|
|
preterrain1.terrain.terrainData.heightmapResolution = (int)preterrain1.heightmap_resolution;
|
|
preterrain1.terrain.terrainData.size = preterrain1.size;
|
|
}
|
|
if ((float)preterrain1.terrain.terrainData.alphamapResolution != preterrain1.splatmap_resolution)
|
|
{
|
|
preterrain1.terrain.terrainData.alphamapResolution = (int)preterrain1.splatmap_resolution;
|
|
}
|
|
if ((float)preterrain1.terrain.terrainData.baseMapResolution != preterrain1.basemap_resolution)
|
|
{
|
|
preterrain1.terrain.terrainData.baseMapResolution = (int)preterrain1.basemap_resolution;
|
|
}
|
|
preterrain1.terrain.terrainData.SetDetailResolution((int)preterrain1.detail_resolution, (int)preterrain1.detail_resolution_per_patch);
|
|
}
|
|
if (flag || flag2)
|
|
{
|
|
Vector3 size = preterrain1.terrain.terrainData.size;
|
|
if (preterrain1.terrain.terrainData.size != preterrain1.size)
|
|
{
|
|
preterrain1.terrain.terrainData.size = preterrain1.size;
|
|
}
|
|
Vector2 vector = new Vector2
|
|
{
|
|
x = preterrain1.size.x / size.x,
|
|
y = preterrain1.size.z / size.z
|
|
};
|
|
preterrain1.prearea.area_max.xMin = 0f;
|
|
preterrain1.prearea.area_max.yMin = 0f;
|
|
preterrain1.prearea.area_max.xMax = preterrain1.terrain.terrainData.size.x;
|
|
preterrain1.prearea.area_max.yMax = preterrain1.terrain.terrainData.size.z;
|
|
preterrain1.prearea.area.xMin = preterrain1.prearea.area.xMin * vector.x;
|
|
preterrain1.prearea.area.xMax = preterrain1.prearea.area.xMax * vector.x;
|
|
preterrain1.prearea.area.yMin = preterrain1.prearea.area.yMin * vector.y;
|
|
preterrain1.prearea.area.yMax = preterrain1.prearea.area.yMax * vector.y;
|
|
}
|
|
get_terrain_settings(preterrain1, "(con)" + command);
|
|
}
|
|
|
|
public virtual void setTerrainAreaMax(terrain_class preterrain1)
|
|
{
|
|
if ((bool)preterrain1.terrain && (bool)preterrain1.terrain.terrainData)
|
|
{
|
|
preterrain1.prearea.area_max = new Rect(0f, 0f, preterrain1.terrain.terrainData.size.x, preterrain1.terrain.terrainData.size.z);
|
|
preterrain1.prearea.area = preterrain1.prearea.area_max;
|
|
}
|
|
}
|
|
|
|
public virtual void set_all_terrain_area(terrain_class preterrain1)
|
|
{
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
terrains[i].prearea.resolution_mode = preterrain1.prearea.resolution_mode;
|
|
terrains[i].prearea.area = preterrain1.prearea.area;
|
|
terrains[i].prearea.step = preterrain1.prearea.step;
|
|
terrains[i].prearea.tree_resolution = preterrain1.prearea.tree_resolution;
|
|
terrains[i].prearea.object_resolution = preterrain1.prearea.object_resolution;
|
|
terrains[i].prearea.set_resolution_mode_text();
|
|
terrains[i].color_terrain = new Color(0.5f, 1f, 0.5f);
|
|
}
|
|
}
|
|
|
|
public virtual void set_all_terrain_settings(terrain_class preterrain1, string command)
|
|
{
|
|
bool flag = false;
|
|
bool flag2 = false;
|
|
if (command.IndexOf("(siz)") != -1)
|
|
{
|
|
flag = true;
|
|
}
|
|
if (command.IndexOf("(res)") != -1)
|
|
{
|
|
flag2 = true;
|
|
}
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if (flag)
|
|
{
|
|
terrains[i].size = preterrain1.size;
|
|
}
|
|
if (flag2)
|
|
{
|
|
terrains[i].heightmap_resolution = preterrain1.heightmap_resolution;
|
|
terrains[i].splatmap_resolution = preterrain1.splatmap_resolution;
|
|
terrains[i].detail_resolution = preterrain1.detail_resolution;
|
|
terrains[i].basemap_resolution = preterrain1.basemap_resolution;
|
|
terrains[i].detail_resolution_per_patch = preterrain1.detail_resolution_per_patch;
|
|
}
|
|
terrains[i].color_terrain = new Color(0.5f, 1f, 0.5f);
|
|
set_terrain_settings(terrains[i], command);
|
|
get_terrain_settings(terrains[i], command);
|
|
}
|
|
}
|
|
|
|
public virtual void object_apply()
|
|
{
|
|
if (object_output && placedObjects.Count > 0)
|
|
{
|
|
for (int i = 0; i < placedObjects.Count; i++)
|
|
{
|
|
placedObjects[i].SetActive(true);
|
|
}
|
|
placedObjects.Clear();
|
|
}
|
|
}
|
|
|
|
public virtual void terrain_apply(terrain_class preterrain1)
|
|
{
|
|
if ((runtime || settings.direct_colormap) && color_output)
|
|
{
|
|
preterrain1.ColorGlobal.Apply();
|
|
}
|
|
if (splat_output || (color_output && !button_export && !settings.direct_colormap))
|
|
{
|
|
for (int i = 0; i < preterrain1.splat_alpha.Length; i++)
|
|
{
|
|
preterrain1.splat_alpha[i].Apply();
|
|
}
|
|
preterrain1.terrain.terrainData.SetAlphamaps(0, 0, preterrain1.terrain.terrainData.GetAlphamaps(0, 0, 1, 1));
|
|
}
|
|
if (grass_output)
|
|
{
|
|
for (int j = default(int); j < preterrain1.grass.Length; j++)
|
|
{
|
|
preterrain1.terrain.terrainData.SetDetailLayer(0, 0, j, grass_detail[j].detail);
|
|
for (int k = 0; (float)k < preterrain1.detail_resolution; k++)
|
|
{
|
|
for (int l = 0; (float)l < preterrain1.detail_resolution; l++)
|
|
{
|
|
grass_detail[j].detail[l, k] = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (heightmap_output)
|
|
{
|
|
preterrain1.terrain.terrainData.SetHeights(0, 0, heights);
|
|
if (smooth_command)
|
|
{
|
|
smooth_terrain(preterrain1, smooth_tool_layer_strength);
|
|
}
|
|
}
|
|
if (tree_output)
|
|
{
|
|
preterrain1.terrain.terrainData.treeInstances = new TreeInstance[tree_instances.Count];
|
|
preterrain1.terrain.terrainData.treeInstances = tree_instances.ToArray();
|
|
}
|
|
preterrain1.terrain.Flush();
|
|
}
|
|
|
|
public virtual void FlushTerrains()
|
|
{
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if (terrains[i].terrain != null && terrains[i].active)
|
|
{
|
|
terrains[i].terrain.Flush();
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual float get_terrain_alpha(terrain_class preterrain1, int local_x, int local_y, int alpha_index)
|
|
{
|
|
int num = alpha_index / 4;
|
|
return preterrain1.splat_alpha[num].GetPixel(local_x, local_y)[alpha_index - num * 4];
|
|
}
|
|
|
|
public virtual void set_all_tree_filters(tree_output_class tree_output, int tree_number, bool all)
|
|
{
|
|
for (int i = 0; i < tree_output.tree.Count; i++)
|
|
{
|
|
if (tree_output.tree_value.active[i] || all)
|
|
{
|
|
if (i != tree_number)
|
|
{
|
|
erase_filters(tree_output.tree[i].prefilter);
|
|
tree_output.tree[i].prefilter = copy_prefilter(tree_output.tree[tree_number].prefilter);
|
|
}
|
|
if (!(tree_output.tree[i].color_tree[0] >= 1.5f))
|
|
{
|
|
tree_output.tree[i].color_tree = tree_output.tree[i].color_tree + new Color(0.5f, 0.5f, 0.5f, 0.5f);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_all_tree_precolor_range(tree_output_class tree_output, int tree_number, bool all)
|
|
{
|
|
for (int i = 0; i < tree_output.tree.Count; i++)
|
|
{
|
|
if (tree_output.tree_value.active[i] || all)
|
|
{
|
|
if (i != tree_number)
|
|
{
|
|
tree_output.tree[i].precolor_range = copy_precolor_range(tree_output.tree[tree_number].precolor_range);
|
|
}
|
|
if (!(tree_output.tree[i].color_tree[0] >= 1.5f))
|
|
{
|
|
tree_output.tree[i].color_tree = tree_output.tree[i].color_tree + new Color(0.5f, 0.5f, 0.5f, 0.5f);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual bool set_auto_object(object_output_class object_output)
|
|
{
|
|
int result;
|
|
if (!object_output.search_object)
|
|
{
|
|
result = 0;
|
|
}
|
|
else
|
|
{
|
|
Transform[] componentsInChildren = object_output.search_object.GetComponentsInChildren<Transform>();
|
|
string text = null;
|
|
add_object(object_output, object_output.@object.Count);
|
|
object_output.@object[object_output.@object.Count - 1].object1 = componentsInChildren[1].gameObject;
|
|
text = componentsInChildren[1].name;
|
|
for (int i = 2; i < componentsInChildren.Length; i++)
|
|
{
|
|
if (componentsInChildren[i].name != text)
|
|
{
|
|
add_object(object_output, object_output.@object.Count);
|
|
object_output.@object[object_output.@object.Count - 1].object1 = componentsInChildren[i].gameObject;
|
|
text = componentsInChildren[i].name;
|
|
}
|
|
else if (object_output.search_erase_doubles)
|
|
{
|
|
UnityEngine.Object.DestroyImmediate(componentsInChildren[i].gameObject);
|
|
}
|
|
}
|
|
result = 1;
|
|
}
|
|
return (byte)result != 0;
|
|
}
|
|
|
|
public virtual void create_terrain(terrain_class preterrain, Vector2 tiles)
|
|
{
|
|
TerrainData terrainData = null;
|
|
GameObject gameObject = null;
|
|
Terrain terrain = null;
|
|
TerrainCollider terrainCollider = null;
|
|
string text = null;
|
|
string text2 = null;
|
|
int num = default(int);
|
|
DeleteTerrain(terrains[0]);
|
|
clear_terrain_list(true);
|
|
if (terrains[0].size.x == 0f)
|
|
{
|
|
terrains[0].size.x = 1000f;
|
|
}
|
|
if (terrains[0].size.y == 0f)
|
|
{
|
|
terrains[0].size.y = 500f;
|
|
}
|
|
if (terrains[0].size.z == 0f)
|
|
{
|
|
terrains[0].size.z = 1000f;
|
|
}
|
|
for (int i = 0; (float)i < tiles.y; i++)
|
|
{
|
|
for (int j = 0; (float)j < tiles.x; j++)
|
|
{
|
|
if (j != 0 || i != 0)
|
|
{
|
|
terrains.Add(new terrain_class());
|
|
}
|
|
num = terrains.Count - 1;
|
|
if (j != 0 || i != 0)
|
|
{
|
|
terrains[num] = copy_terrain(terrains[0]);
|
|
}
|
|
terrains[num].tile_x = j;
|
|
terrains[num].tile_z = i;
|
|
terrains[num].tiles = tiles;
|
|
terrains[num].index = num;
|
|
gameObject = new GameObject();
|
|
if ((bool)terrain_parent)
|
|
{
|
|
gameObject.transform.parent = terrain_parent;
|
|
}
|
|
terrain = (Terrain)gameObject.AddComponent(typeof(Terrain));
|
|
terrainCollider = (TerrainCollider)gameObject.AddComponent(typeof(TerrainCollider));
|
|
text = "_x" + j.ToString() + "_y" + i.ToString();
|
|
terrain.name = terrain_scene_name + text;
|
|
terrainData = new TerrainData();
|
|
terrainData.size = terrains[0].size;
|
|
terrain.terrainData = terrainData;
|
|
terrainCollider.terrainData = terrainData;
|
|
terrains[num].terrain = terrain;
|
|
set_terrain_splat_textures(terrains[num], terrains[num]);
|
|
set_terrain_trees(terrains[num]);
|
|
set_terrain_details(terrains[num]);
|
|
set_terrain_settings(terrains[num], "(all)");
|
|
if (settings.copy_terrain_material)
|
|
{
|
|
terrain.materialTemplate = terrains[0].terrain.materialTemplate;
|
|
}
|
|
set_terrain_parameters(terrains[num], terrains[0]);
|
|
get_terrain_parameter_settings(terrains[num]);
|
|
terrains[num].foldout = false;
|
|
if ((bool)terrains[0].rtp_script)
|
|
{
|
|
assign_rtp_single(terrains[num]);
|
|
}
|
|
}
|
|
}
|
|
FitTerrainTiles(preterrain, true);
|
|
}
|
|
|
|
public virtual void create_terrain2(terrain_class preterrain1, int length, int name_number)
|
|
{
|
|
for (int i = 0; i < length; i++)
|
|
{
|
|
TerrainData terrainData = new TerrainData();
|
|
terrainData.heightmapResolution = (int)preterrain1.heightmap_resolution;
|
|
terrainData.baseMapResolution = (int)preterrain1.basemap_resolution;
|
|
terrainData.alphamapResolution = (int)preterrain1.splatmap_resolution;
|
|
terrainData.SetDetailResolution((int)preterrain1.detail_resolution, (int)preterrain1.detail_resolution_per_patch);
|
|
if (preterrain1.size.x == 0f)
|
|
{
|
|
preterrain1.size.x = 1000f;
|
|
}
|
|
if (preterrain1.size.y == 0f)
|
|
{
|
|
preterrain1.size.y = 500f;
|
|
}
|
|
if (preterrain1.size.z == 0f)
|
|
{
|
|
preterrain1.size.z = 1000f;
|
|
}
|
|
terrainData.size = preterrain1.size;
|
|
GameObject gameObject = Terrain.CreateTerrainGameObject(terrainData);
|
|
if ((bool)preterrain1.parent)
|
|
{
|
|
gameObject.transform.parent = preterrain1.parent;
|
|
}
|
|
Terrain terrain = (Terrain)gameObject.GetComponent(typeof(Terrain));
|
|
terrain.name = terrain_scene_name + (i + name_number);
|
|
if (terrains.Count < i + name_number)
|
|
{
|
|
set_terrain_length(terrains.Count + 1);
|
|
}
|
|
terrains[i + name_number - 1].terrain = terrain;
|
|
if (i != 0)
|
|
{
|
|
set_terrain_parameters(terrains[i + name_number - 1], terrains[name_number - 1]);
|
|
}
|
|
else
|
|
{
|
|
set_terrain_parameters(terrains[i + name_number - 1], terrains[i + name_number - 1]);
|
|
}
|
|
get_terrain_settings(terrains[i + name_number - 1], "(res)(con)(fir)");
|
|
terrains[i + name_number - 1].tile_x = 0f;
|
|
terrains[i + name_number - 1].tile_z = 0f;
|
|
terrains[i + name_number - 1].tiles = new Vector2(1f, 1f);
|
|
terrains[i + name_number - 1].terrain.transform.position = new Vector3((0f - preterrain1.size.x) / 2f, 0f, (0f - preterrain1.size.z) / 2f);
|
|
terrains[i + name_number - 1].prearea.max();
|
|
}
|
|
set_all_terrain_area(preterrain1);
|
|
set_all_terrain_splat_textures(preterrain1, true, true);
|
|
assign_all_terrain_splat_alpha();
|
|
set_all_terrain_trees(preterrain1);
|
|
set_all_terrain_details(preterrain1);
|
|
}
|
|
|
|
public virtual void assign_all_terrain_splat_alpha()
|
|
{
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
assign_terrain_splat_alpha(terrains[i]);
|
|
}
|
|
}
|
|
|
|
public virtual void assign_terrain_splat_alpha(terrain_class preterrain1)
|
|
{
|
|
if ((bool)preterrain1.terrain && (bool)preterrain1.terrain.terrainData && preterrain1.terrain.terrainData.splatPrototypes.Length >= 1)
|
|
{
|
|
Type type = preterrain1.terrain.terrainData.GetType();
|
|
PropertyInfo property = type.GetProperty("alphamapTextures", BindingFlags.Instance | BindingFlags.NonPublic);
|
|
if (RuntimeServices.EqualityOperator(property, null))
|
|
{
|
|
property = type.GetProperty("alphamapTextures", BindingFlags.Instance | BindingFlags.Public);
|
|
}
|
|
if (!RuntimeServices.EqualityOperator(property, null))
|
|
{
|
|
preterrain1.splat_alpha = property.GetValue(preterrain1.terrain.terrainData, null) as Texture2D[];
|
|
}
|
|
else
|
|
{
|
|
Debug.LogError("Can't access alphamapTexture directly...");
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void randomize_layer_offset(layer_output_enum layer_output, Vector2 offset, int seed)
|
|
{
|
|
UnityEngine.Random.seed = seed;
|
|
for (int i = 0; i < prelayers[0].layer.Count; i++)
|
|
{
|
|
if (prelayers[0].layer[i].output == layer_output)
|
|
{
|
|
prelayers[0].layer[i].offset = new Vector2(UnityEngine.Random.Range(offset.x, offset.y), UnityEngine.Random.Range(offset.x, offset.y));
|
|
prelayers[0].layer[i].offset_middle = prelayers[0].layer[i].offset;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_auto_terrain()
|
|
{
|
|
Terrain[] array = (Terrain[])UnityEngine.Object.FindObjectsOfType(typeof(Terrain));
|
|
if (array.Length > 0)
|
|
{
|
|
terrains.Clear();
|
|
int num = default(int);
|
|
for (num = 0; num < array.Length; num++)
|
|
{
|
|
string input = array[num].name;
|
|
string s = Regex.Replace(input, "[^0-9]", string.Empty);
|
|
float result = 0f;
|
|
if (float.TryParse(s, out result))
|
|
{
|
|
terrains.Add(new terrain_class());
|
|
terrains[terrains.Count - 1].terrain = array[num];
|
|
terrains[terrains.Count - 1].name = terrains[terrains.Count - 1].terrain.name;
|
|
terrains[terrains.Count - 1].index = terrains.Count - 1;
|
|
get_terrain_settings(terrains[terrains.Count - 1], "(all)(fir)(spl)(tre)");
|
|
}
|
|
}
|
|
}
|
|
set_smooth_tool_terrain_popup();
|
|
set_terrain_text();
|
|
}
|
|
|
|
public virtual void AutoSearchTerrains()
|
|
{
|
|
Terrain[] array = null;
|
|
Terrain terrain = null;
|
|
Rect rect = default(Rect);
|
|
Vector2 tile = default(Vector2);
|
|
Vector2 zero = Vector2.zero;
|
|
List<TempTerrain_Class> list = new List<TempTerrain_Class>();
|
|
array = ((!(terrainSearchParent != null)) ? ((Terrain[])UnityEngine.Object.FindObjectsOfType(typeof(Terrain))) : terrainSearchParent.GetComponentsInChildren<Terrain>());
|
|
if (array.Length == 0)
|
|
{
|
|
return;
|
|
}
|
|
terrains.Clear();
|
|
rect = GetTerrainsArea(array);
|
|
zero.x = Mathf.Round(rect.width / array[0].terrainData.size.x);
|
|
zero.y = Mathf.Round(rect.height / array[0].terrainData.size.z);
|
|
for (int i = 0; i < array.Length; i++)
|
|
{
|
|
terrain = array[i];
|
|
tile.x = Mathf.Round((terrain.transform.position.x - rect.xMin) / terrain.terrainData.size.x);
|
|
tile.y = Mathf.Round((terrain.transform.position.z - rect.yMin) / terrain.terrainData.size.z);
|
|
list.Add(new TempTerrain_Class(terrain, tile));
|
|
}
|
|
for (int j = 0; (float)j < zero.y; j++)
|
|
{
|
|
for (int k = 0; (float)k < zero.x; k++)
|
|
{
|
|
for (int i = 0; i < list.Count; i++)
|
|
{
|
|
if ((float)k == list[i].tile.x && (float)j == list[i].tile.y)
|
|
{
|
|
terrains.Add(new terrain_class());
|
|
terrains[terrains.Count - 1].terrain = list[i].terrain;
|
|
terrains[terrains.Count - 1].tile_x = list[i].tile.x;
|
|
terrains[terrains.Count - 1].tile_z = list[i].tile.y;
|
|
terrains[terrains.Count - 1].tiles = zero;
|
|
get_terrain_settings(terrains[terrains.Count - 1], "(all)(fir)(spl)(tre)");
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void AutoSearchTiles()
|
|
{
|
|
terrain_class terrain_class3 = null;
|
|
Rect rect = default(Rect);
|
|
Vector2 vector = default(Vector2);
|
|
Vector2 zero = Vector2.zero;
|
|
List<terrain_class> list = new List<terrain_class>();
|
|
int num = -1;
|
|
rect = GetTerrainsArea();
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if (terrains[i].terrain != null && terrains[i].terrain.terrainData != null)
|
|
{
|
|
num = i;
|
|
break;
|
|
}
|
|
}
|
|
if (num == -1)
|
|
{
|
|
return;
|
|
}
|
|
zero.x = Mathf.Round(rect.width / terrains[num].terrain.terrainData.size.x);
|
|
zero.y = Mathf.Round(rect.height / terrains[num].terrain.terrainData.size.z);
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
terrain_class3 = terrains[i];
|
|
terrain_class3.tiles = zero;
|
|
list.Add(terrains[i]);
|
|
if (!(terrain_class3.terrain == null) && !(terrain_class3.terrain.terrainData == null))
|
|
{
|
|
terrain_class3.tile_x = Mathf.Round((terrain_class3.terrain.transform.position.x - rect.xMin) / terrain_class3.terrain.terrainData.size.x);
|
|
terrain_class3.tile_z = Mathf.Round((terrain_class3.terrain.transform.position.z - rect.yMin) / terrain_class3.terrain.terrainData.size.z);
|
|
}
|
|
}
|
|
terrains.Clear();
|
|
for (int j = 0; (float)j < zero.y; j++)
|
|
{
|
|
for (int k = 0; (float)k < zero.x; k++)
|
|
{
|
|
for (int i = 0; i < list.Count; i++)
|
|
{
|
|
if ((float)k == list[i].tile_x && (float)j == list[i].tile_z)
|
|
{
|
|
terrains.Add(list[i]);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual Rect GetTerrainsArea(Terrain[] terrainObjects)
|
|
{
|
|
float num = 1E+11f;
|
|
float num2 = -1E+11f;
|
|
float num3 = 1E+11f;
|
|
float num4 = -1E+11f;
|
|
Vector3 vector = default(Vector3);
|
|
for (int i = 0; i < terrainObjects.Length; i++)
|
|
{
|
|
if (!(terrainObjects[i].terrainData == null))
|
|
{
|
|
vector = terrainObjects[i].terrainData.size;
|
|
if (!(terrainObjects[i].transform.position.x > num))
|
|
{
|
|
num = terrainObjects[i].transform.position.x;
|
|
}
|
|
if (!(terrainObjects[i].transform.position.z > num3))
|
|
{
|
|
num3 = terrainObjects[i].transform.position.z;
|
|
}
|
|
if (!(terrainObjects[i].transform.position.x + vector.x < num2))
|
|
{
|
|
num2 = terrainObjects[i].transform.position.x + vector.x;
|
|
}
|
|
if (!(terrainObjects[i].transform.position.z + vector.z < num4))
|
|
{
|
|
num4 = terrainObjects[i].transform.position.z + vector.z;
|
|
}
|
|
}
|
|
}
|
|
return new Rect(num, num3, num2 - num, num4 - num3);
|
|
}
|
|
|
|
public virtual Rect GetTerrainsArea()
|
|
{
|
|
float num = 1E+11f;
|
|
float num2 = -1E+11f;
|
|
float num3 = 1E+11f;
|
|
float num4 = -1E+11f;
|
|
Vector3 vector = default(Vector3);
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if (!(terrains[i].terrain == null) && !(terrains[i].terrain.terrainData == null))
|
|
{
|
|
vector = terrains[i].terrain.terrainData.size;
|
|
if (!(terrains[i].terrain.transform.position.x > num))
|
|
{
|
|
num = terrains[i].terrain.transform.position.x;
|
|
}
|
|
if (!(terrains[i].terrain.transform.position.z > num3))
|
|
{
|
|
num3 = terrains[i].terrain.transform.position.z;
|
|
}
|
|
if (!(terrains[i].terrain.transform.position.x + vector.x < num2))
|
|
{
|
|
num2 = terrains[i].terrain.transform.position.x + vector.x;
|
|
}
|
|
if (!(terrains[i].terrain.transform.position.z + vector.z < num4))
|
|
{
|
|
num4 = terrains[i].terrain.transform.position.z + vector.z;
|
|
}
|
|
}
|
|
}
|
|
return new Rect(num, num3, num2 - num, num4 - num3);
|
|
}
|
|
|
|
public virtual void set_auto_mesh()
|
|
{
|
|
MeshFilter[] array = null;
|
|
array = ((!(object_search == null)) ? object_search.GetComponentsInChildren<MeshFilter>() : ((MeshFilter[])UnityEngine.Object.FindObjectsOfType(typeof(MeshFilter))));
|
|
if (RuntimeServices.EqualityOperator(array, null) || array.Length <= 0)
|
|
{
|
|
return;
|
|
}
|
|
meshes.Clear();
|
|
for (int i = 0; i < array.Length; i++)
|
|
{
|
|
if ((array[i].gameObject.layer & meshes_layer) == meshes_layer)
|
|
{
|
|
meshes.Add(new mesh_class());
|
|
meshes[meshes.Count - 1].gameObject = array[i].gameObject;
|
|
meshes[meshes.Count - 1].transform = array[i].transform;
|
|
meshes[meshes.Count - 1].collider = (MeshCollider)array[i].GetComponent(typeof(MeshCollider));
|
|
meshes[meshes.Count - 1].meshFilter = (MeshFilter)array[i].GetComponent(typeof(MeshFilter));
|
|
meshes[meshes.Count - 1].mesh = meshes[meshes.Count - 1].meshFilter.sharedMesh;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual int get_rank_in_list(List<int> list, int number)
|
|
{
|
|
int num = 0;
|
|
for (int i = 0; i < list.Count; i++)
|
|
{
|
|
if (list[number] > list[i])
|
|
{
|
|
num++;
|
|
}
|
|
}
|
|
return num;
|
|
}
|
|
|
|
public virtual bool check_terrains_assigned()
|
|
{
|
|
int num = 0;
|
|
int result;
|
|
while (true)
|
|
{
|
|
if (num < terrains.Count)
|
|
{
|
|
if (!terrains[num].terrain)
|
|
{
|
|
result = 0;
|
|
break;
|
|
}
|
|
if (!terrains[num].terrain.terrainData)
|
|
{
|
|
result = 0;
|
|
break;
|
|
}
|
|
num++;
|
|
continue;
|
|
}
|
|
result = 1;
|
|
break;
|
|
}
|
|
return (byte)result != 0;
|
|
}
|
|
|
|
public virtual bool find_mesh()
|
|
{
|
|
return (prelayer.count_terrain < meshes.Count) ? true : false;
|
|
}
|
|
|
|
public virtual bool find_terrain(bool first)
|
|
{
|
|
ulong num = default(ulong);
|
|
int num2 = prelayer.count_terrain;
|
|
int result;
|
|
while (true)
|
|
{
|
|
if (num2 < terrains.Count)
|
|
{
|
|
if (terrains[num2].active)
|
|
{
|
|
tree_instances.Clear();
|
|
for (int i = 0; i < settings.treemap.Count; i++)
|
|
{
|
|
if (tree_output && settings.treemap[i].load && (bool)settings.treemap[i].map)
|
|
{
|
|
load_tree(i, num2);
|
|
}
|
|
}
|
|
if ((runtime || settings.direct_colormap) && color_output && (bool)terrains[num2].rtp_script)
|
|
{
|
|
Type type = terrains[num2].rtp_script.GetType();
|
|
FieldInfo field = type.GetField("ColorGlobal");
|
|
terrains[num2].ColorGlobal = field.GetValue(terrains[num2].rtp_script) as Texture2D;
|
|
}
|
|
if (object_output && settings.parentObjectsTerrain)
|
|
{
|
|
terrains[num2].objectParent = new GameObject();
|
|
terrains[num2].objectParent.transform.parent = terrains[num2].terrain.transform;
|
|
terrains[num2].objectParent.name = "Objects";
|
|
}
|
|
if (!first)
|
|
{
|
|
if (heightmap_output)
|
|
{
|
|
num = (ulong)(terrains[num2].heightmap_resolution * terrains[num2].heightmap_resolution);
|
|
if (num != (ulong)heights.Length)
|
|
{
|
|
heights = (float[,])System.Array.CreateInstance(typeof(float), new int[2]
|
|
{
|
|
(int)terrains[num2].heightmap_resolution,
|
|
(int)terrains[num2].heightmap_resolution
|
|
});
|
|
}
|
|
}
|
|
if (grass_output)
|
|
{
|
|
if (terrains[num2].terrain.terrainData.detailPrototypes.Length > grass_detail.Length)
|
|
{
|
|
grass_detail = new detail_class[terrains[num2].terrain.terrainData.detailPrototypes.Length];
|
|
}
|
|
for (int j = 0; j < grass_detail.Length; j++)
|
|
{
|
|
if (grass_detail[j] == null)
|
|
{
|
|
grass_detail[j] = new detail_class();
|
|
}
|
|
if (grass_detail[j].detail != null)
|
|
{
|
|
if (terrains[num2].detail_resolution * terrains[num2].detail_resolution != (float)grass_detail[j].detail.Length)
|
|
{
|
|
grass_detail[j].detail = (int[,])System.Array.CreateInstance(typeof(int), new int[2]
|
|
{
|
|
(int)terrains[num2].detail_resolution,
|
|
(int)terrains[num2].detail_resolution
|
|
});
|
|
}
|
|
}
|
|
else
|
|
{
|
|
grass_detail[j].detail = (int[,])System.Array.CreateInstance(typeof(int), new int[2]
|
|
{
|
|
(int)terrains[num2].detail_resolution,
|
|
(int)terrains[num2].detail_resolution
|
|
});
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for (int k = 0; k < settings.grassmap.Count; k++)
|
|
{
|
|
if (grass_output && settings.grassmap[k].load && (bool)settings.grassmap[k].map)
|
|
{
|
|
load_grass(k, num2);
|
|
}
|
|
}
|
|
if (prelayer.count_terrain > 0)
|
|
{
|
|
set_image_terrain_mode(num2);
|
|
}
|
|
result = 1;
|
|
break;
|
|
}
|
|
prelayer.count_terrain++;
|
|
num2++;
|
|
continue;
|
|
}
|
|
result = 0;
|
|
break;
|
|
}
|
|
return (byte)result != 0;
|
|
}
|
|
|
|
public virtual void load_tree(int treemap_index, int terrain_index)
|
|
{
|
|
tree_script = settings.treemap[treemap_index].map.GetComponent("save_trees") as save_trees;
|
|
if (tree_script.tree_save.Count - 1 < terrain_index)
|
|
{
|
|
return;
|
|
}
|
|
int count = tree_script.tree_save[terrain_index].treeInstances.Count;
|
|
TreeInstance item = default(TreeInstance);
|
|
int num = default(int);
|
|
Vector3 size = terrains[terrain_index].terrain.terrainData.size;
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
num = tree_script.tree_save[terrain_index].treeInstances[i].prototypeIndex;
|
|
if (UnityEngine.Random.Range(0f, 1f) <= settings.treemap[treemap_index].tree_param[num].density)
|
|
{
|
|
item.position = tree_script.tree_save[terrain_index].treeInstances[i].position;
|
|
item.position.y = terrains[terrain_index].terrain.terrainData.GetInterpolatedHeight(item.position.x, item.position.z) / size.y;
|
|
item.widthScale = tree_script.tree_save[terrain_index].treeInstances[i].widthScale * settings.treemap[treemap_index].tree_param[num].scale;
|
|
item.heightScale = tree_script.tree_save[terrain_index].treeInstances[i].heightScale * settings.treemap[treemap_index].tree_param[num].scale;
|
|
item.color = tree_script.tree_save[terrain_index].treeInstances[i].color;
|
|
item.lightmapColor = tree_script.tree_save[terrain_index].treeInstances[i].lightmapColor;
|
|
item.prototypeIndex = settings.treemap[treemap_index].tree_param[num].prototype;
|
|
tree_instances.Add(item);
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void load_grass(int grassmap_index, int terrain_index)
|
|
{
|
|
grass_script = settings.grassmap[grassmap_index].map.GetComponent("save_grass") as save_grass;
|
|
if (grass_script.grass_save.Count - 1 < terrain_index)
|
|
{
|
|
return;
|
|
}
|
|
int num = grass_script.grass_save[terrain_index].resolution;
|
|
int num2 = default(int);
|
|
int count = grass_script.grass_save[terrain_index].details.Count;
|
|
float num3 = (float)num / terrains[terrain_index].detail_resolution * ((float)num / terrains[terrain_index].detail_resolution);
|
|
int num4 = default(int);
|
|
for (int i = 0; i < count && i <= terrains[terrain_index].terrain.terrainData.detailPrototypes.Length - 1; i++)
|
|
{
|
|
num4 = grass_detail[settings.grassmap[grassmap_index].grass_param[i].prototype].detail.Length;
|
|
num2 = (int)terrains[terrain_index].detail_resolution;
|
|
for (int j = 0; j < num4; j++)
|
|
{
|
|
grass_detail[settings.grassmap[grassmap_index].grass_param[i].prototype].detail[j - j / num2 * num2, j / num2] = (int)((float)grass_detail[settings.grassmap[grassmap_index].grass_param[i].prototype].detail[j - j / num2 * num2, j / num2] + (float)grass_script.grass_save[terrain_index].details[i].detail[(int)((float)j * num3)] * settings.grassmap[grassmap_index].grass_param[i].density);
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void assign_rtp(bool active, bool open_link)
|
|
{
|
|
Type type = null;
|
|
FieldInfo fieldInfo = null;
|
|
Type type2 = null;
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if ((bool)terrains[i].terrain)
|
|
{
|
|
if (active)
|
|
{
|
|
assign_rtp_single(terrains[i]);
|
|
}
|
|
else
|
|
{
|
|
terrains[i].rtp_script = null;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void assign_rtp_single(terrain_class terrain1)
|
|
{
|
|
}
|
|
|
|
public virtual void center_terrain_position(terrain_class preterrain1)
|
|
{
|
|
if ((bool)preterrain1.terrain && (bool)preterrain1.terrain.terrainData)
|
|
{
|
|
preterrain1.terrain.transform.position = new Vector3((0f - preterrain1.terrain.terrainData.size.x) / 2f, 0f, (0f - preterrain1.terrain.terrainData.size.z) / 2f);
|
|
}
|
|
}
|
|
|
|
public virtual bool check_terrains_square()
|
|
{
|
|
float f = terrains.Count;
|
|
float num = Mathf.Round(Mathf.Sqrt(f));
|
|
return (num == Mathf.Sqrt(f)) ? true : false;
|
|
}
|
|
|
|
public virtual int FitTerrainTiles(terrain_class preterrain1, bool refit)
|
|
{
|
|
Vector3 size = preterrain1.size;
|
|
Vector2 tiles = preterrain1.tiles;
|
|
Vector3 vector = new Vector3(0f - size.x * tiles.x / 2f, 0f, 0f - size.z * tiles.y / 2f);
|
|
Vector3 vector2 = default(Vector3);
|
|
set_all_terrain_settings(preterrain1, "(siz)");
|
|
if (refit)
|
|
{
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
vector2 = vector + new Vector3(terrains[i].tile_x * size.x, 0f, terrains[i].tile_z * size.z);
|
|
terrains[i].color_terrain = new Color(0.5f, 1f, 0.5f);
|
|
if (terrains[i].terrain != null)
|
|
{
|
|
terrains[i].terrain.transform.position = vector2;
|
|
}
|
|
}
|
|
}
|
|
tile_resolution = (int)(tiles.x * size.x);
|
|
terrains[0].SetAllNeighbors(terrains);
|
|
set_neighbor2(1);
|
|
return 1;
|
|
}
|
|
|
|
public virtual int fit_terrain_tiles(terrain_class preterrain1, bool refit)
|
|
{
|
|
int result;
|
|
if (terrains.Count < 2)
|
|
{
|
|
center_terrain_position(terrains[0]);
|
|
result = 1;
|
|
}
|
|
else if (!check_terrains_assigned())
|
|
{
|
|
result = -2;
|
|
}
|
|
else
|
|
{
|
|
Vector3 size = preterrain1.size;
|
|
float f = terrains.Count;
|
|
float num = Mathf.Round(Mathf.Sqrt(f));
|
|
if (num != Mathf.Sqrt(f))
|
|
{
|
|
reset_terrains_tiles(this);
|
|
result = -3;
|
|
}
|
|
else
|
|
{
|
|
set_all_terrain_settings(preterrain1, "(siz)");
|
|
for (float num2 = 0f; num2 < num; num2 += 1f)
|
|
{
|
|
for (float num3 = 0f; num3 < num; num3 += 1f)
|
|
{
|
|
float num4 = num2 * num + num3;
|
|
if (!(num4 >= (float)terrains.Count))
|
|
{
|
|
Vector3 vector = default(Vector3);
|
|
Vector3 vector2 = default(Vector3);
|
|
if (num == 2f)
|
|
{
|
|
vector2.z = num - num3 - 2f;
|
|
vector.z = vector2.z * size.z;
|
|
vector2.x = 0f - num + num2 + 1f;
|
|
vector.x = vector2.x * size.x;
|
|
vector.y = 0f;
|
|
}
|
|
else
|
|
{
|
|
vector2.z = (num - num3 * 2f - 2f) / 2f;
|
|
vector.z = vector2.z * size.z;
|
|
vector2.x = (0f - num + num2 * 2f) / 2f;
|
|
vector.x = vector2.x * size.x;
|
|
vector.y = 0f;
|
|
}
|
|
if (refit)
|
|
{
|
|
terrains[(int)num4].terrain.transform.position = vector;
|
|
}
|
|
terrains[(int)num4].tile_x = num2;
|
|
terrains[(int)num4].tile_z = num - num3 - 1f;
|
|
terrains[(int)num4].tiles.x = num;
|
|
terrains[(int)num4].tiles.y = num;
|
|
terrains[(int)num4].color_terrain = new Color(0.5f, 1f, 0.5f);
|
|
}
|
|
}
|
|
}
|
|
tile_resolution = (int)(num * size.x);
|
|
terrains[0].SetAllNeighbors(terrains);
|
|
set_neighbor2(1);
|
|
result = 1;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual void set_neighbor2(int mode)
|
|
{
|
|
TerrainNeighbors terrainNeighbors = null;
|
|
int num = default(int);
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if (!terrains[i].terrain)
|
|
{
|
|
continue;
|
|
}
|
|
terrainNeighbors = (TerrainNeighbors)terrains[i].terrain.GetComponent(typeof(TerrainNeighbors));
|
|
if (mode == 1)
|
|
{
|
|
if (!terrainNeighbors)
|
|
{
|
|
terrainNeighbors = (TerrainNeighbors)terrains[i].terrain.gameObject.AddComponent(typeof(TerrainNeighbors));
|
|
}
|
|
terrainNeighbors.left = null;
|
|
terrainNeighbors.top = null;
|
|
terrainNeighbors.right = null;
|
|
terrainNeighbors.bottom = null;
|
|
num = search_tile((int)(terrains[i].tile_x - 1f), (int)terrains[i].tile_z);
|
|
if (num != -1)
|
|
{
|
|
terrainNeighbors.left = terrains[num].terrain;
|
|
}
|
|
num = search_tile((int)terrains[i].tile_x, (int)(terrains[i].tile_z + 1f));
|
|
if (num != -1)
|
|
{
|
|
terrainNeighbors.top = terrains[num].terrain;
|
|
}
|
|
num = search_tile((int)(terrains[i].tile_x + 1f), (int)terrains[i].tile_z);
|
|
if (num != -1)
|
|
{
|
|
terrainNeighbors.right = terrains[num].terrain;
|
|
}
|
|
num = search_tile((int)terrains[i].tile_x, (int)(terrains[i].tile_z - 1f));
|
|
if (num != -1)
|
|
{
|
|
terrainNeighbors.bottom = terrains[num].terrain;
|
|
}
|
|
}
|
|
if (mode == -1 && (bool)terrainNeighbors)
|
|
{
|
|
UnityEngine.Object.DestroyImmediate(terrainNeighbors);
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_detail_script(int mode)
|
|
{
|
|
TerrainDetail terrainDetail = null;
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if ((bool)terrains[i].terrain)
|
|
{
|
|
terrainDetail = (TerrainDetail)terrains[i].terrain.GetComponent(typeof(TerrainDetail));
|
|
if (mode == 1 && !terrainDetail)
|
|
{
|
|
terrainDetail = (TerrainDetail)terrains[i].terrain.gameObject.AddComponent(typeof(TerrainDetail));
|
|
}
|
|
if (mode == -1 && (bool)terrainDetail)
|
|
{
|
|
UnityEngine.Object.DestroyImmediate(terrainDetail);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual int search_tile(int tile_x, int tile_z)
|
|
{
|
|
int result;
|
|
if ((float)tile_x > terrains[0].tiles.x - 1f || tile_x < 0)
|
|
{
|
|
result = -1;
|
|
}
|
|
else if ((float)tile_z > terrains[0].tiles.y - 1f || tile_z < 0)
|
|
{
|
|
result = -1;
|
|
}
|
|
else
|
|
{
|
|
int num = 0;
|
|
while (true)
|
|
{
|
|
if (num < terrains.Count)
|
|
{
|
|
if (terrains[num].tile_x == (float)tile_x && terrains[num].tile_z == (float)tile_z)
|
|
{
|
|
result = num;
|
|
break;
|
|
}
|
|
num++;
|
|
continue;
|
|
}
|
|
result = -1;
|
|
break;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual void set_all_trees_settings_terrain(terrain_class preterrain1, int tree_number)
|
|
{
|
|
for (int i = 0; i < preterrain1.treePrototypes.Count; i++)
|
|
{
|
|
preterrain1.treePrototypes[i].bendFactor = preterrain1.treePrototypes[tree_number].bendFactor;
|
|
}
|
|
if (!(preterrain1.color_terrain[0] >= 1.5f))
|
|
{
|
|
preterrain1.color_terrain += new Color(0.5f, 1f, 0.5f, 0.5f);
|
|
}
|
|
}
|
|
|
|
public virtual void set_all_trees_settings_terrains(terrain_class preterrain1, int tree_number)
|
|
{
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
for (int j = 0; j < preterrain1.treePrototypes.Count; j++)
|
|
{
|
|
if (terrains[i].treePrototypes.Count - 1 >= j)
|
|
{
|
|
terrains[i].treePrototypes[j].bendFactor = preterrain1.treePrototypes[tree_number].bendFactor;
|
|
}
|
|
}
|
|
check_synchronous_terrain_trees(terrains[i]);
|
|
if (!(terrains[i].color_terrain[0] >= 1.5f))
|
|
{
|
|
terrains[i].color_terrain = terrains[i].color_terrain + new Color(0.5f, 1f, 0.5f, 0.5f);
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_all_terrain_splat_textures(terrain_class preterrain1, bool copy, bool flash)
|
|
{
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if ((bool)terrains[i].terrain)
|
|
{
|
|
if (copy)
|
|
{
|
|
set_terrain_splat_textures(preterrain1, terrains[i]);
|
|
}
|
|
else
|
|
{
|
|
set_terrain_splat_textures(terrains[i], terrains[i]);
|
|
}
|
|
get_terrain_splat_textures(terrains[i]);
|
|
if (flash && !(terrains[i].color_terrain[0] >= 1.5f))
|
|
{
|
|
terrains[i].color_terrain = new Color(0.5f, 1f, 0.5f);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_all_terrain_color_textures(bool flash)
|
|
{
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
set_terrain_color_textures(terrains[i]);
|
|
if (flash && !(terrains[i].color_terrain[0] >= 1.5f))
|
|
{
|
|
terrains[i].color_terrain = new Color(0.5f, 1f, 0.5f);
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_terrain_color_textures(terrain_class preterrain1)
|
|
{
|
|
if (!preterrain1.terrain)
|
|
{
|
|
return;
|
|
}
|
|
object value = default(object);
|
|
FieldInfo field2 = default(FieldInfo);
|
|
FieldInfo field3 = default(FieldInfo);
|
|
FieldInfo field4 = default(FieldInfo);
|
|
Texture2D[] array = default(Texture2D[]);
|
|
Texture2D[] array2 = default(Texture2D[]);
|
|
Texture2D[] array3 = default(Texture2D[]);
|
|
if ((bool)preterrain1.rtp_script)
|
|
{
|
|
Type type = preterrain1.rtp_script.GetType();
|
|
FieldInfo field = type.GetField("globalSettingsHolder");
|
|
value = field.GetValue(preterrain1.rtp_script);
|
|
Type type2 = value.GetType();
|
|
field2 = type2.GetField("splats");
|
|
field3 = type2.GetField("Bumps");
|
|
field4 = type2.GetField("Heights");
|
|
array = new Texture2D[preterrain1.splatPrototypes.Count];
|
|
array2 = new Texture2D[preterrain1.splatPrototypes.Count];
|
|
array3 = new Texture2D[preterrain1.splatPrototypes.Count];
|
|
}
|
|
List<SplatPrototype> list = new List<SplatPrototype>();
|
|
for (int i = 0; i < settings.color_splatPrototypes.Length; i++)
|
|
{
|
|
list.Add(new SplatPrototype());
|
|
if ((bool)preterrain1.rtp_script && (bool)settings.color_splatPrototypes[i].texture)
|
|
{
|
|
array[i] = settings.color_splatPrototypes[i].texture;
|
|
array2[i] = null;
|
|
array3[i] = null;
|
|
}
|
|
if ((bool)settings.color_splatPrototypes[i].texture)
|
|
{
|
|
list[i].texture = settings.color_splatPrototypes[i].texture;
|
|
list[i].tileSize = settings.color_splatPrototypes[i].tileSize;
|
|
list[i].tileOffset = settings.color_splatPrototypes[i].tileOffset;
|
|
}
|
|
}
|
|
preterrain1.terrain.terrainData.splatPrototypes = list.ToArray();
|
|
if ((bool)preterrain1.rtp_script)
|
|
{
|
|
field2.SetValue(value, array);
|
|
field3.SetValue(value, array2);
|
|
field4.SetValue(value, array3);
|
|
}
|
|
}
|
|
|
|
public virtual void set_terrain_splat_textures(terrain_class preterrain1, terrain_class preterrain2)
|
|
{
|
|
if (!preterrain1.terrain)
|
|
{
|
|
return;
|
|
}
|
|
object value = default(object);
|
|
FieldInfo field2 = default(FieldInfo);
|
|
FieldInfo field3 = default(FieldInfo);
|
|
FieldInfo field4 = default(FieldInfo);
|
|
Texture2D[] array = default(Texture2D[]);
|
|
Texture2D[] array2 = default(Texture2D[]);
|
|
Texture2D[] array3 = default(Texture2D[]);
|
|
if ((bool)preterrain1.rtp_script)
|
|
{
|
|
Type type = preterrain1.rtp_script.GetType();
|
|
FieldInfo field = type.GetField("globalSettingsHolder");
|
|
value = field.GetValue(preterrain1.rtp_script);
|
|
Type type2 = value.GetType();
|
|
field2 = type2.GetField("splats");
|
|
field3 = type2.GetField("Bumps");
|
|
field4 = type2.GetField("Heights");
|
|
array = new Texture2D[preterrain1.splatPrototypes.Count];
|
|
array2 = new Texture2D[preterrain1.splatPrototypes.Count];
|
|
array3 = new Texture2D[preterrain1.splatPrototypes.Count];
|
|
}
|
|
List<SplatPrototype> list = new List<SplatPrototype>();
|
|
for (int i = 0; i < preterrain1.splatPrototypes.Count; i++)
|
|
{
|
|
if ((bool)preterrain1.splatPrototypes[i].texture)
|
|
{
|
|
list.Add(new SplatPrototype());
|
|
if (settings.colormap && i == 0)
|
|
{
|
|
list[i].texture = preterrain2.splatPrototypes[i].texture;
|
|
list[i].normalMap = preterrain2.splatPrototypes[i].normalMap;
|
|
list[i].tileSize = preterrain2.splatPrototypes[i].tileSize;
|
|
list[i].tileOffset = preterrain2.splatPrototypes[i].tileOffset;
|
|
}
|
|
else
|
|
{
|
|
list[i].texture = preterrain1.splatPrototypes[i].texture;
|
|
list[i].normalMap = preterrain1.splatPrototypes[i].normalMap;
|
|
list[i].tileSize = preterrain1.splatPrototypes[i].tileSize;
|
|
list[i].tileOffset = preterrain1.splatPrototypes[i].tileOffset;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
preterrain1.splatPrototypes.RemoveAt(i);
|
|
i--;
|
|
}
|
|
if ((bool)preterrain1.rtp_script)
|
|
{
|
|
array[i] = preterrain1.splatPrototypes[i].texture;
|
|
array2[i] = preterrain1.splatPrototypes[i].normal_texture;
|
|
array3[i] = preterrain1.splatPrototypes[i].height_texture;
|
|
}
|
|
}
|
|
preterrain2.terrain.terrainData.splatPrototypes = list.ToArray();
|
|
if ((bool)preterrain1.rtp_script)
|
|
{
|
|
field2.SetValue(value, array);
|
|
field3.SetValue(value, array2);
|
|
field4.SetValue(value, array3);
|
|
}
|
|
if (RuntimeServices.EqualityOperator(preterrain1, masterTerrain))
|
|
{
|
|
loop_prelayer("(ssc)", 0, true);
|
|
}
|
|
}
|
|
|
|
public virtual void set_colormap(bool active, bool all_parameters)
|
|
{
|
|
int num = 0;
|
|
if (active)
|
|
{
|
|
float num2 = default(float);
|
|
for (num = 0; num < terrains.Count; num++)
|
|
{
|
|
if (all_parameters)
|
|
{
|
|
terrains[num].add_splatprototype(0);
|
|
}
|
|
num2 = ((!terrains[num].terrain) ? terrains[num].size.x : terrains[num].terrain.terrainData.size.x);
|
|
if (terrains[num].splatPrototypes.Count > 0)
|
|
{
|
|
if (all_parameters)
|
|
{
|
|
terrains[num].splatPrototypes[0].texture = terrains[num].colormap.texture;
|
|
}
|
|
terrains[num].colormap.tileSize = new Vector2(num2, num2);
|
|
terrains[num].splatPrototypes[0].tileSize = terrains[num].colormap.tileSize;
|
|
terrains[num].splatPrototypes[0].tileOffset = terrains[num].colormap.tileOffset;
|
|
if ((bool)terrains[num].splatPrototypes[0].texture)
|
|
{
|
|
set_terrain_splat_textures(terrains[num], terrains[num]);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (num = 0; num < terrains.Count; num++)
|
|
{
|
|
if (terrains[num].splatPrototypes.Count > 0)
|
|
{
|
|
terrains[num].colormap.texture = terrains[num].splatPrototypes[0].texture;
|
|
terrains[num].erase_splatprototype(0);
|
|
set_terrain_splat_textures(terrains[num], terrains[num]);
|
|
}
|
|
}
|
|
}
|
|
loop_colormap(active);
|
|
}
|
|
|
|
public virtual void loop_colormap(bool active)
|
|
{
|
|
for (int i = 0; i < prelayers.Count; i++)
|
|
{
|
|
for (int j = 0; j < prelayers[i].layer.Count; j++)
|
|
{
|
|
if (prelayers[i].layer[j].output != layer_output_enum.splat)
|
|
{
|
|
continue;
|
|
}
|
|
for (int k = 0; k < prelayers[i].layer[j].splat_output.splat.Count; k++)
|
|
{
|
|
if (prelayers[i].layer[j].splat_output.splat[k] == 0)
|
|
{
|
|
if (!active)
|
|
{
|
|
prelayers[i].layer[j].splat_output.splat_value.active[k] = false;
|
|
continue;
|
|
}
|
|
prelayers[i].layer[j].splat_output.splat[k] = prelayers[i].layer[j].splat_output.splat[k] + 1;
|
|
prelayers[i].layer[j].splat_output.splat_value.active[k] = true;
|
|
}
|
|
else if (!active)
|
|
{
|
|
prelayers[i].layer[j].splat_output.splat[k] = prelayers[i].layer[j].splat_output.splat[k] - 1;
|
|
}
|
|
else
|
|
{
|
|
prelayers[i].layer[j].splat_output.splat[k] = prelayers[i].layer[j].splat_output.splat[k] + 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void get_all_terrain_splat_textures()
|
|
{
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
get_terrain_splat_textures(terrains[i]);
|
|
check_synchronous_terrain_textures(terrains[i]);
|
|
}
|
|
}
|
|
|
|
public virtual void get_terrain_splat_textures(terrain_class preterrain1)
|
|
{
|
|
if (!preterrain1.terrain)
|
|
{
|
|
return;
|
|
}
|
|
Texture2D[] array = default(Texture2D[]);
|
|
Texture2D[] array2 = default(Texture2D[]);
|
|
Texture2D[] array3 = default(Texture2D[]);
|
|
if ((bool)preterrain1.rtp_script)
|
|
{
|
|
Type type = preterrain1.rtp_script.GetType();
|
|
FieldInfo field = type.GetField("globalSettingsHolder");
|
|
object value = field.GetValue(preterrain1.rtp_script);
|
|
Type type2 = value.GetType();
|
|
FieldInfo field2 = type2.GetField("splats");
|
|
array = field2.GetValue(value) as Texture2D[];
|
|
field2 = type2.GetField("Bumps");
|
|
array2 = field2.GetValue(value) as Texture2D[];
|
|
field2 = type2.GetField("Heights");
|
|
array3 = field2.GetValue(value) as Texture2D[];
|
|
}
|
|
for (int i = 0; i < preterrain1.terrain.terrainData.splatPrototypes.Length; i++)
|
|
{
|
|
if (preterrain1.splatPrototypes.Count - 1 < i)
|
|
{
|
|
preterrain1.splatPrototypes.Add(new splatPrototype_class());
|
|
}
|
|
preterrain1.splatPrototypes[i].tileSize = preterrain1.terrain.terrainData.splatPrototypes[i].tileSize;
|
|
preterrain1.splatPrototypes[i].tileOffset = preterrain1.terrain.terrainData.splatPrototypes[i].tileOffset;
|
|
if (!preterrain1.rtp_script)
|
|
{
|
|
preterrain1.splatPrototypes[i].texture = preterrain1.terrain.terrainData.splatPrototypes[i].texture;
|
|
preterrain1.splatPrototypes[i].normalMap = preterrain1.terrain.terrainData.splatPrototypes[i].normalMap;
|
|
}
|
|
else
|
|
{
|
|
preterrain1.splatPrototypes[i].texture = array[i];
|
|
preterrain1.splatPrototypes[i].normal_texture = array2[i];
|
|
preterrain1.splatPrototypes[i].height_texture = array3[i];
|
|
}
|
|
}
|
|
int num = preterrain1.splatPrototypes.Count - preterrain1.terrain.terrainData.splatPrototypes.Length;
|
|
for (int i = 0; i < num; i++)
|
|
{
|
|
preterrain1.splatPrototypes.RemoveAt(preterrain1.splatPrototypes.Count - 1);
|
|
}
|
|
}
|
|
|
|
public virtual void check_synchronous_terrains_textures()
|
|
{
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
check_synchronous_terrain_textures(terrains[i]);
|
|
}
|
|
}
|
|
|
|
public virtual void check_synchronous_terrain_textures(terrain_class preterrain1)
|
|
{
|
|
check_synchronous_terrain_splat_textures(preterrain1);
|
|
}
|
|
|
|
public virtual void check_synchronous_terrains_splat_textures()
|
|
{
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
check_synchronous_terrain_splat_textures(terrains[i]);
|
|
}
|
|
}
|
|
|
|
public virtual void check_synchronous_terrain_splat_textures(terrain_class preterrain1)
|
|
{
|
|
if (!preterrain1.terrain || !preterrain1.terrain.terrainData)
|
|
{
|
|
return;
|
|
}
|
|
Texture2D[] array = default(Texture2D[]);
|
|
Texture2D[] array2 = default(Texture2D[]);
|
|
Texture2D[] array3 = default(Texture2D[]);
|
|
if ((bool)preterrain1.rtp_script)
|
|
{
|
|
Type type = preterrain1.rtp_script.GetType();
|
|
FieldInfo field = type.GetField("globalSettingsHolder");
|
|
object value = field.GetValue(preterrain1.rtp_script);
|
|
Type type2 = value.GetType();
|
|
FieldInfo field2 = type2.GetField("splats");
|
|
array = field2.GetValue(value) as Texture2D[];
|
|
field2 = type2.GetField("Bumps");
|
|
array2 = field2.GetValue(value) as Texture2D[];
|
|
field2 = type2.GetField("Heights");
|
|
array3 = field2.GetValue(value) as Texture2D[];
|
|
}
|
|
bool splat_synchronous = true;
|
|
if (preterrain1.splatPrototypes.Count != preterrain1.terrain.terrainData.splatPrototypes.Length)
|
|
{
|
|
splat_synchronous = false;
|
|
}
|
|
else
|
|
{
|
|
for (int i = 0; i < preterrain1.splatPrototypes.Count; i++)
|
|
{
|
|
if (!preterrain1.rtp_script)
|
|
{
|
|
if (preterrain1.splatPrototypes[i].texture != preterrain1.terrain.terrainData.splatPrototypes[i].texture)
|
|
{
|
|
splat_synchronous = false;
|
|
break;
|
|
}
|
|
if (preterrain1.splatPrototypes[i].normalMap != preterrain1.terrain.terrainData.splatPrototypes[i].normalMap)
|
|
{
|
|
splat_synchronous = false;
|
|
break;
|
|
}
|
|
if (preterrain1.splatPrototypes[i].tileOffset != preterrain1.terrain.terrainData.splatPrototypes[i].tileOffset)
|
|
{
|
|
splat_synchronous = false;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (preterrain1.splatPrototypes[i].texture != array[i])
|
|
{
|
|
splat_synchronous = false;
|
|
break;
|
|
}
|
|
if (preterrain1.splatPrototypes[i].normal_texture != array2[i])
|
|
{
|
|
splat_synchronous = false;
|
|
break;
|
|
}
|
|
if (preterrain1.splatPrototypes[i].height_texture != array3[i])
|
|
{
|
|
splat_synchronous = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
preterrain1.splat_synchronous = splat_synchronous;
|
|
}
|
|
|
|
public virtual void check_synchronous_terrains_color_textures()
|
|
{
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
check_synchronous_terrain_color_textures(terrains[i]);
|
|
}
|
|
}
|
|
|
|
public virtual void check_synchronous_terrain_color_textures(terrain_class preterrain1)
|
|
{
|
|
if (!preterrain1.terrain || !preterrain1.terrain.terrainData)
|
|
{
|
|
return;
|
|
}
|
|
Texture2D[] array = default(Texture2D[]);
|
|
if ((bool)preterrain1.rtp_script)
|
|
{
|
|
Type type = preterrain1.rtp_script.GetType();
|
|
FieldInfo field = type.GetField("globalSettingsHolder");
|
|
object value = field.GetValue(preterrain1.rtp_script);
|
|
Type type2 = value.GetType();
|
|
FieldInfo field2 = type2.GetField("splats");
|
|
array = field2.GetValue(value) as Texture2D[];
|
|
field2 = type2.GetField("Bumps");
|
|
Texture2D[] array2 = field2.GetValue(value) as Texture2D[];
|
|
field2 = type2.GetField("Heights");
|
|
Texture2D[] array3 = field2.GetValue(value) as Texture2D[];
|
|
}
|
|
bool splat_synchronous = true;
|
|
if (settings.color_splatPrototypes.Length != preterrain1.terrain.terrainData.splatPrototypes.Length)
|
|
{
|
|
splat_synchronous = false;
|
|
}
|
|
else
|
|
{
|
|
for (int i = 0; i < settings.color_splatPrototypes.Length; i++)
|
|
{
|
|
if (!preterrain1.rtp_script)
|
|
{
|
|
if (settings.color_splatPrototypes[i].texture != preterrain1.terrain.terrainData.splatPrototypes[i].texture)
|
|
{
|
|
splat_synchronous = false;
|
|
break;
|
|
}
|
|
if (settings.color_splatPrototypes[i].tileOffset != preterrain1.terrain.terrainData.splatPrototypes[i].tileOffset)
|
|
{
|
|
splat_synchronous = false;
|
|
break;
|
|
}
|
|
}
|
|
else if (settings.color_splatPrototypes[i].texture != array[i])
|
|
{
|
|
splat_synchronous = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
preterrain1.splat_synchronous = splat_synchronous;
|
|
}
|
|
|
|
public virtual void check_synchronous_terrain_size(terrain_class preterrain1)
|
|
{
|
|
if ((bool)preterrain1.terrain && (bool)preterrain1.terrain.terrainData)
|
|
{
|
|
bool size_synchronous = true;
|
|
if (preterrain1.size.x != preterrain1.terrain.terrainData.size.x || preterrain1.size.y != preterrain1.terrain.terrainData.size.y || preterrain1.size.z != preterrain1.terrain.terrainData.size.z)
|
|
{
|
|
size_synchronous = false;
|
|
}
|
|
preterrain1.size_synchronous = size_synchronous;
|
|
}
|
|
}
|
|
|
|
public virtual void check_synchronous_terrain_resolutions(terrain_class preterrain1)
|
|
{
|
|
if ((bool)preterrain1.terrain && (bool)preterrain1.terrain.terrainData)
|
|
{
|
|
bool resolutions_synchronous = true;
|
|
if (preterrain1.heightmap_resolution != (float)preterrain1.terrain.terrainData.heightmapResolution || preterrain1.splatmap_resolution != (float)preterrain1.terrain.terrainData.alphamapResolution || preterrain1.detail_resolution != (float)preterrain1.terrain.terrainData.detailResolution || preterrain1.basemap_resolution != (float)preterrain1.terrain.terrainData.baseMapResolution)
|
|
{
|
|
resolutions_synchronous = false;
|
|
}
|
|
preterrain1.resolutions_synchronous = resolutions_synchronous;
|
|
}
|
|
}
|
|
|
|
public virtual void copy_terrain_splat(splatPrototype_class splatPrototype1, splatPrototype_class splatPrototype2)
|
|
{
|
|
splatPrototype2.texture = splatPrototype1.texture;
|
|
splatPrototype2.tileSize_old = splatPrototype1.tileSize_old;
|
|
splatPrototype2.tileOffset = splatPrototype1.tileOffset;
|
|
splatPrototype2.normal_texture = splatPrototype1.normal_texture;
|
|
splatPrototype2.normal_tileSize = splatPrototype1.normal_tileSize;
|
|
splatPrototype2.height_texture = splatPrototype1.height_texture;
|
|
}
|
|
|
|
public virtual void copy_terrain_splats(terrain_class preterrain1, terrain_class preterrain2)
|
|
{
|
|
for (int i = 0; i < preterrain1.splatPrototypes.Count; i++)
|
|
{
|
|
if (preterrain2.splatPrototypes.Count < preterrain1.splatPrototypes.Count)
|
|
{
|
|
preterrain2.splatPrototypes.Add(new splatPrototype_class());
|
|
}
|
|
copy_terrain_splat(preterrain1.splatPrototypes[i], preterrain2.splatPrototypes[i]);
|
|
}
|
|
}
|
|
|
|
public virtual void swap_terrain_splat(terrain_class preterrain1, int splat_number1, int splat_number2)
|
|
{
|
|
if (splat_number2 > -1 && splat_number2 < preterrain1.splatPrototypes.Count)
|
|
{
|
|
splatPrototype_class value = preterrain1.splatPrototypes[splat_number1];
|
|
preterrain1.splatPrototypes[splat_number1] = preterrain1.splatPrototypes[splat_number2];
|
|
preterrain1.splatPrototypes[splat_number2] = value;
|
|
}
|
|
}
|
|
|
|
public virtual void set_all_terrain_trees(terrain_class preterrain1)
|
|
{
|
|
set_terrain_trees(preterrain1);
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if ((bool)terrains[i].terrain)
|
|
{
|
|
terrains[i].terrain.terrainData.treePrototypes = preterrain1.terrain.terrainData.treePrototypes;
|
|
get_terrain_trees(terrains[i]);
|
|
terrains[i].color_terrain = new Color(0.5f, 1f, 0.5f);
|
|
check_synchronous_terrain_trees(terrains[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_terrain_trees(terrain_class preterrain1)
|
|
{
|
|
List<TreePrototype> list = new List<TreePrototype>();
|
|
for (int i = 0; i < preterrain1.treePrototypes.Count; i++)
|
|
{
|
|
if ((bool)preterrain1.treePrototypes[i].prefab)
|
|
{
|
|
list.Add(new TreePrototype());
|
|
list[i].prefab = preterrain1.treePrototypes[i].prefab;
|
|
list[i].bendFactor = preterrain1.treePrototypes[i].bendFactor;
|
|
}
|
|
}
|
|
preterrain1.terrain.terrainData.treePrototypes = list.ToArray();
|
|
}
|
|
|
|
public virtual void get_all_terrain_trees()
|
|
{
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
get_terrain_trees(terrains[i]);
|
|
check_synchronous_terrain_trees(terrains[i]);
|
|
}
|
|
}
|
|
|
|
public virtual void get_terrain_trees(terrain_class preterrain1)
|
|
{
|
|
preterrain1.treePrototypes.Clear();
|
|
for (int i = 0; i < preterrain1.terrain.terrainData.treePrototypes.Length; i++)
|
|
{
|
|
preterrain1.treePrototypes.Add(new treePrototype_class());
|
|
preterrain1.treePrototypes[i].prefab = preterrain1.terrain.terrainData.treePrototypes[i].prefab;
|
|
preterrain1.treePrototypes[i].bendFactor = preterrain1.terrain.terrainData.treePrototypes[i].bendFactor;
|
|
}
|
|
}
|
|
|
|
public virtual void check_synchronous_terrain_trees(terrain_class preterrain1)
|
|
{
|
|
if (!preterrain1.terrain || !preterrain1.terrain.terrainData)
|
|
{
|
|
return;
|
|
}
|
|
bool tree_synchronous = true;
|
|
if (preterrain1.treePrototypes.Count != preterrain1.terrain.terrainData.treePrototypes.Length)
|
|
{
|
|
tree_synchronous = false;
|
|
}
|
|
else
|
|
{
|
|
for (int i = 0; i < preterrain1.treePrototypes.Count; i++)
|
|
{
|
|
if (preterrain1.treePrototypes[i].prefab != preterrain1.terrain.terrainData.treePrototypes[i].prefab)
|
|
{
|
|
tree_synchronous = false;
|
|
break;
|
|
}
|
|
if (preterrain1.treePrototypes[i].bendFactor != preterrain1.terrain.terrainData.treePrototypes[i].bendFactor)
|
|
{
|
|
tree_synchronous = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
preterrain1.tree_synchronous = tree_synchronous;
|
|
}
|
|
|
|
public virtual void copy_terrain_tree(treePrototype_class treePrototype1, treePrototype_class treePrototype2)
|
|
{
|
|
treePrototype2.prefab = treePrototype1.prefab;
|
|
treePrototype2.bendFactor = treePrototype1.bendFactor;
|
|
}
|
|
|
|
public virtual void copy_terrain_trees(terrain_class preterrain1, terrain_class preterrain2)
|
|
{
|
|
for (int i = 0; i < preterrain1.treePrototypes.Count; i++)
|
|
{
|
|
if (preterrain2.treePrototypes.Count < preterrain1.treePrototypes.Count)
|
|
{
|
|
preterrain2.treePrototypes.Add(new treePrototype_class());
|
|
}
|
|
copy_terrain_tree(preterrain1.treePrototypes[i], preterrain2.treePrototypes[i]);
|
|
}
|
|
}
|
|
|
|
public virtual void swap_terrain_tree(terrain_class preterrain1, int tree_number1, int tree_number2)
|
|
{
|
|
if (tree_number2 > -1 && tree_number2 < preterrain1.treePrototypes.Count)
|
|
{
|
|
treePrototype_class value = preterrain1.treePrototypes[tree_number1];
|
|
preterrain1.treePrototypes[tree_number1] = preterrain1.treePrototypes[tree_number2];
|
|
preterrain1.treePrototypes[tree_number2] = value;
|
|
}
|
|
}
|
|
|
|
public virtual void set_terrain_details(terrain_class preterrain1)
|
|
{
|
|
List<DetailPrototype> list = new List<DetailPrototype>();
|
|
for (int i = 0; i < preterrain1.detailPrototypes.Count; i++)
|
|
{
|
|
if ((bool)preterrain1.detailPrototypes[i].prototype || (bool)preterrain1.detailPrototypes[i].prototypeTexture)
|
|
{
|
|
list.Add(new DetailPrototype());
|
|
list[i].renderMode = preterrain1.detailPrototypes[i].renderMode;
|
|
if (preterrain1.detailPrototypes[i].usePrototypeMesh)
|
|
{
|
|
list[i].usePrototypeMesh = true;
|
|
list[i].prototype = preterrain1.detailPrototypes[i].prototype;
|
|
list[i].minWidth = -1f;
|
|
list[i].maxWidth = preterrain1.detailPrototypes[i].maxWidth + 1f;
|
|
list[i].minHeight = -1f;
|
|
list[i].maxHeight = preterrain1.detailPrototypes[i].maxHeight + 1f;
|
|
}
|
|
else
|
|
{
|
|
list[i].prototypeTexture = preterrain1.detailPrototypes[i].prototypeTexture;
|
|
list[i].minWidth = preterrain1.detailPrototypes[i].minWidth;
|
|
list[i].maxWidth = preterrain1.detailPrototypes[i].maxWidth;
|
|
list[i].minHeight = preterrain1.detailPrototypes[i].minHeight;
|
|
list[i].maxHeight = preterrain1.detailPrototypes[i].maxHeight;
|
|
}
|
|
list[i].noiseSpread = preterrain1.detailPrototypes[i].noiseSpread;
|
|
list[i].healthyColor = preterrain1.detailPrototypes[i].healthyColor;
|
|
list[i].dryColor = preterrain1.detailPrototypes[i].dryColor;
|
|
list[i].bendFactor = preterrain1.detailPrototypes[i].bendFactor;
|
|
}
|
|
}
|
|
preterrain1.terrain.terrainData.detailPrototypes = list.ToArray();
|
|
preterrain1.detail_scale = 1f;
|
|
}
|
|
|
|
public virtual void copy_terrain_detail(detailPrototype_class detailPrototype1, detailPrototype_class detailPrototype2)
|
|
{
|
|
detailPrototype2.prototype = detailPrototype1.prototype;
|
|
detailPrototype2.prototypeTexture = detailPrototype1.prototypeTexture;
|
|
detailPrototype2.minWidth = detailPrototype1.minWidth;
|
|
detailPrototype2.maxWidth = detailPrototype1.maxWidth;
|
|
detailPrototype2.minHeight = detailPrototype1.minHeight;
|
|
detailPrototype2.maxHeight = detailPrototype1.maxHeight;
|
|
detailPrototype2.noiseSpread = detailPrototype1.noiseSpread;
|
|
detailPrototype2.healthyColor = detailPrototype1.healthyColor;
|
|
detailPrototype2.dryColor = detailPrototype1.dryColor;
|
|
detailPrototype2.renderMode = detailPrototype1.renderMode;
|
|
detailPrototype2.bendFactor = detailPrototype1.bendFactor;
|
|
}
|
|
|
|
public virtual void copy_terrain_details(terrain_class preterrain1, terrain_class preterrain2)
|
|
{
|
|
for (int i = 0; i < preterrain1.detailPrototypes.Count; i++)
|
|
{
|
|
if (preterrain2.detailPrototypes.Count < preterrain1.detailPrototypes.Count)
|
|
{
|
|
preterrain2.detailPrototypes.Add(new detailPrototype_class());
|
|
}
|
|
copy_terrain_detail(preterrain1.detailPrototypes[i], preterrain2.detailPrototypes[i]);
|
|
}
|
|
}
|
|
|
|
public virtual void swap_terrain_detail(terrain_class preterrain1, int detail_number1, int detail_number2)
|
|
{
|
|
if (detail_number2 > -1 && detail_number2 < preterrain1.detailPrototypes.Count)
|
|
{
|
|
detailPrototype_class value = preterrain1.detailPrototypes[detail_number1];
|
|
preterrain1.detailPrototypes[detail_number1] = preterrain1.detailPrototypes[detail_number2];
|
|
preterrain1.detailPrototypes[detail_number2] = value;
|
|
}
|
|
}
|
|
|
|
public virtual void get_all_terrain_details()
|
|
{
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
get_terrain_details(terrains[i]);
|
|
check_synchronous_terrain_detail(terrains[i]);
|
|
}
|
|
}
|
|
|
|
public virtual void get_terrain_details(terrain_class preterrain1)
|
|
{
|
|
for (int i = 0; i < preterrain1.terrain.terrainData.detailPrototypes.Length; i++)
|
|
{
|
|
if (preterrain1.detailPrototypes.Count < preterrain1.terrain.terrainData.detailPrototypes.Length)
|
|
{
|
|
preterrain1.detailPrototypes.Add(new detailPrototype_class());
|
|
}
|
|
else if (preterrain1.detailPrototypes.Count > preterrain1.terrain.terrainData.detailPrototypes.Length)
|
|
{
|
|
preterrain1.detailPrototypes.RemoveAt(i);
|
|
}
|
|
if (preterrain1.detailPrototypes[i].usePrototypeMesh)
|
|
{
|
|
preterrain1.detailPrototypes[i].prototype = preterrain1.terrain.terrainData.detailPrototypes[i].prototype;
|
|
preterrain1.detailPrototypes[i].minWidth = preterrain1.terrain.terrainData.detailPrototypes[i].minWidth;
|
|
preterrain1.detailPrototypes[i].maxWidth = preterrain1.terrain.terrainData.detailPrototypes[i].maxWidth - 1f;
|
|
preterrain1.detailPrototypes[i].minHeight = preterrain1.terrain.terrainData.detailPrototypes[i].minHeight;
|
|
preterrain1.detailPrototypes[i].maxHeight = preterrain1.terrain.terrainData.detailPrototypes[i].maxHeight - 1f;
|
|
}
|
|
else
|
|
{
|
|
preterrain1.detailPrototypes[i].prototypeTexture = preterrain1.terrain.terrainData.detailPrototypes[i].prototypeTexture;
|
|
preterrain1.detailPrototypes[i].minWidth = preterrain1.terrain.terrainData.detailPrototypes[i].minWidth;
|
|
preterrain1.detailPrototypes[i].maxWidth = preterrain1.terrain.terrainData.detailPrototypes[i].maxWidth;
|
|
preterrain1.detailPrototypes[i].minHeight = preterrain1.terrain.terrainData.detailPrototypes[i].minHeight;
|
|
preterrain1.detailPrototypes[i].maxHeight = preterrain1.terrain.terrainData.detailPrototypes[i].maxHeight;
|
|
}
|
|
preterrain1.detailPrototypes[i].noiseSpread = preterrain1.terrain.terrainData.detailPrototypes[i].noiseSpread;
|
|
preterrain1.detailPrototypes[i].healthyColor = preterrain1.terrain.terrainData.detailPrototypes[i].healthyColor;
|
|
preterrain1.detailPrototypes[i].dryColor = preterrain1.terrain.terrainData.detailPrototypes[i].dryColor;
|
|
preterrain1.detailPrototypes[i].renderMode = preterrain1.terrain.terrainData.detailPrototypes[i].renderMode;
|
|
preterrain1.detailPrototypes[i].bendFactor = preterrain1.terrain.terrainData.detailPrototypes[i].bendFactor;
|
|
}
|
|
if (preterrain1.terrain.terrainData.detailPrototypes.Length == 0)
|
|
{
|
|
preterrain1.detailPrototypes.Clear();
|
|
}
|
|
}
|
|
|
|
public virtual void check_synchronous_terrain_detail(terrain_class preterrain1)
|
|
{
|
|
if (!preterrain1.terrain || !preterrain1.terrain.terrainData)
|
|
{
|
|
return;
|
|
}
|
|
bool detail_synchronous = true;
|
|
if (preterrain1.detailPrototypes.Count != preterrain1.terrain.terrainData.detailPrototypes.Length)
|
|
{
|
|
detail_synchronous = false;
|
|
}
|
|
else
|
|
{
|
|
for (int i = 0; i < preterrain1.detailPrototypes.Count; i++)
|
|
{
|
|
if (preterrain1.detailPrototypes[i].usePrototypeMesh)
|
|
{
|
|
if (preterrain1.detailPrototypes[i].prototype != preterrain1.terrain.terrainData.detailPrototypes[i].prototype)
|
|
{
|
|
detail_synchronous = false;
|
|
break;
|
|
}
|
|
if (preterrain1.detailPrototypes[i].maxWidth != preterrain1.terrain.terrainData.detailPrototypes[i].maxWidth - 1f)
|
|
{
|
|
detail_synchronous = false;
|
|
break;
|
|
}
|
|
if (preterrain1.detailPrototypes[i].maxHeight != preterrain1.terrain.terrainData.detailPrototypes[i].maxHeight - 1f)
|
|
{
|
|
detail_synchronous = false;
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (preterrain1.detailPrototypes[i].prototypeTexture != preterrain1.terrain.terrainData.detailPrototypes[i].prototypeTexture)
|
|
{
|
|
detail_synchronous = false;
|
|
break;
|
|
}
|
|
if (preterrain1.detailPrototypes[i].minWidth != preterrain1.terrain.terrainData.detailPrototypes[i].minWidth)
|
|
{
|
|
detail_synchronous = false;
|
|
break;
|
|
}
|
|
if (preterrain1.detailPrototypes[i].maxWidth != preterrain1.terrain.terrainData.detailPrototypes[i].maxWidth)
|
|
{
|
|
detail_synchronous = false;
|
|
break;
|
|
}
|
|
if (preterrain1.detailPrototypes[i].minHeight != preterrain1.terrain.terrainData.detailPrototypes[i].minHeight)
|
|
{
|
|
detail_synchronous = false;
|
|
break;
|
|
}
|
|
if (preterrain1.detailPrototypes[i].maxHeight != preterrain1.terrain.terrainData.detailPrototypes[i].maxHeight)
|
|
{
|
|
detail_synchronous = false;
|
|
break;
|
|
}
|
|
}
|
|
if (preterrain1.detailPrototypes[i].noiseSpread != preterrain1.terrain.terrainData.detailPrototypes[i].noiseSpread)
|
|
{
|
|
detail_synchronous = false;
|
|
break;
|
|
}
|
|
if (preterrain1.detailPrototypes[i].healthyColor != preterrain1.terrain.terrainData.detailPrototypes[i].healthyColor)
|
|
{
|
|
detail_synchronous = false;
|
|
break;
|
|
}
|
|
if (preterrain1.detailPrototypes[i].dryColor != preterrain1.terrain.terrainData.detailPrototypes[i].dryColor)
|
|
{
|
|
detail_synchronous = false;
|
|
break;
|
|
}
|
|
if (preterrain1.detailPrototypes[i].renderMode != preterrain1.terrain.terrainData.detailPrototypes[i].renderMode)
|
|
{
|
|
detail_synchronous = false;
|
|
break;
|
|
}
|
|
if (preterrain1.detailPrototypes[i].bendFactor != preterrain1.terrain.terrainData.detailPrototypes[i].bendFactor)
|
|
{
|
|
detail_synchronous = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
preterrain1.detail_synchronous = detail_synchronous;
|
|
}
|
|
|
|
public virtual void change_terrain_detail_scale(terrain_class preterrain1)
|
|
{
|
|
if (preterrain1.terrain.terrainData.detailPrototypes.Length >= preterrain1.detailPrototypes.Count)
|
|
{
|
|
for (int i = 0; i < preterrain1.detailPrototypes.Count; i++)
|
|
{
|
|
preterrain1.detailPrototypes[i].minWidth = preterrain1.terrain.terrainData.detailPrototypes[i].minWidth * preterrain1.detail_scale;
|
|
preterrain1.detailPrototypes[i].maxWidth = preterrain1.terrain.terrainData.detailPrototypes[i].maxWidth * preterrain1.detail_scale;
|
|
preterrain1.detailPrototypes[i].minHeight = preterrain1.terrain.terrainData.detailPrototypes[i].minHeight * preterrain1.detail_scale;
|
|
preterrain1.detailPrototypes[i].maxHeight = preterrain1.terrain.terrainData.detailPrototypes[i].maxHeight * preterrain1.detail_scale;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_all_terrain_details(terrain_class preterrain1)
|
|
{
|
|
set_terrain_details(preterrain1);
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if ((bool)terrains[i].terrain)
|
|
{
|
|
terrains[i].terrain.terrainData.detailPrototypes = preterrain1.terrain.terrainData.detailPrototypes;
|
|
get_terrain_details(terrains[i]);
|
|
terrains[i].color_terrain = new Color(0.5f, 1f, 0.5f);
|
|
check_synchronous_terrain_detail(terrains[i]);
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual Color convert_float_to_color(float value_float)
|
|
{
|
|
byte[] array = new byte[4];
|
|
Color result = default(Color);
|
|
float num = default(float);
|
|
array = BitConverter.GetBytes(value_float);
|
|
num = (int)array[0];
|
|
result[0] = num / 255f;
|
|
num = (int)array[1];
|
|
result[1] = num / 255f;
|
|
num = (int)array[2];
|
|
result[2] = num / 255f;
|
|
num = (int)array[3];
|
|
result[3] = num / 255f;
|
|
return result;
|
|
}
|
|
|
|
public virtual float convert_color_to_float(Color color)
|
|
{
|
|
return BitConverter.ToSingle(new byte[4]
|
|
{
|
|
(byte)(color[0] * 255f),
|
|
(byte)(color[1] * 255f),
|
|
(byte)(color[2] * 255f),
|
|
(byte)(color[3] * 255f)
|
|
}, 0);
|
|
}
|
|
|
|
public virtual float get_scale_from_image(Texture2D image)
|
|
{
|
|
Color color = default(Color);
|
|
Color color2 = default(Color);
|
|
float num = default(float);
|
|
color[0] = image.GetPixel(0, 0)[3];
|
|
color[1] = image.GetPixel(1, 0)[3];
|
|
color[2] = image.GetPixel(2, 0)[3];
|
|
color[3] = image.GetPixel(3, 0)[3];
|
|
return convert_color_to_float(color);
|
|
}
|
|
|
|
public virtual Vector2 calc_rotation_pixel(float x, float y, float xx, float yy, float rotation)
|
|
{
|
|
float num = x - xx;
|
|
float num2 = y - yy;
|
|
float num3 = Mathf.Sqrt(num * num + num2 * num2);
|
|
if (num3 != 0f)
|
|
{
|
|
num /= num3;
|
|
num2 /= num3;
|
|
}
|
|
float num4 = Mathf.Acos(num);
|
|
if (!(num2 >= 0f))
|
|
{
|
|
num4 = (float)Math.PI * 2f - num4;
|
|
}
|
|
num4 -= rotation * ((float)Math.PI / 180f);
|
|
num = Mathf.Cos(num4) * num3;
|
|
num2 = Mathf.Sin(num4) * num3;
|
|
return new Vector2
|
|
{
|
|
x = num + xx,
|
|
y = num2 + yy
|
|
};
|
|
}
|
|
|
|
public virtual prelayer_class copy_prelayer(prelayer_class prelayer1, object copy_filter)
|
|
{
|
|
prelayer_class prelayer_class2 = null;
|
|
GameObject gameObject = new GameObject();
|
|
save_template save_template2 = (save_template)gameObject.AddComponent(typeof(save_template));
|
|
save_template2.prelayer = prelayer1;
|
|
GameObject gameObject2 = UnityEngine.Object.Instantiate(gameObject);
|
|
UnityEngine.Object.DestroyImmediate(gameObject);
|
|
save_template2 = (save_template)gameObject2.GetComponent(typeof(save_template));
|
|
prelayer_class2 = save_template2.prelayer;
|
|
UnityEngine.Object.DestroyImmediate(gameObject2);
|
|
if (RuntimeServices.ToBool(copy_filter))
|
|
{
|
|
for (int i = 0; i < prelayer1.layer.Count; i++)
|
|
{
|
|
prelayer_class2.layer[i].prefilter = copy_prefilter(prelayer1.layer[i].prefilter);
|
|
}
|
|
}
|
|
return prelayer_class2;
|
|
}
|
|
|
|
public virtual prelayer_class copy_layergroup(prelayer_class prelayer1, int description_number, bool copy_filter)
|
|
{
|
|
GameObject gameObject = new GameObject();
|
|
save_template save_template2 = (save_template)gameObject.AddComponent(typeof(save_template));
|
|
prelayer_class prelayer_class2 = null;
|
|
save_template2.prelayer = new prelayer_class(0, 0);
|
|
for (int i = 0; i < prelayer1.predescription.description[description_number].layer_index.Count; i++)
|
|
{
|
|
save_template2.prelayer.layer.Insert(i, new layer_class());
|
|
save_template2.prelayer.layer[i] = copy_layer(prelayer1.layer[prelayer1.predescription.description[description_number].layer_index[i]], false, false);
|
|
}
|
|
GameObject gameObject2 = UnityEngine.Object.Instantiate(gameObject);
|
|
UnityEngine.Object.DestroyImmediate(gameObject);
|
|
save_template2 = (save_template)gameObject2.GetComponent(typeof(save_template));
|
|
prelayer_class2 = save_template2.prelayer;
|
|
UnityEngine.Object.DestroyImmediate(gameObject2);
|
|
if (copy_filter)
|
|
{
|
|
for (int i = 0; i < prelayer1.layer.Count; i++)
|
|
{
|
|
prelayer_class2.layer[i].prefilter = copy_prefilter(prelayer1.layer[i].prefilter);
|
|
for (int j = 0; j < prelayer1.layer[i].tree_output.tree.Count; j++)
|
|
{
|
|
prelayer_class2.layer[i].tree_output.tree[j].prefilter = copy_prefilter(prelayer1.layer[i].tree_output.tree[j].prefilter);
|
|
}
|
|
}
|
|
}
|
|
return prelayer_class2;
|
|
}
|
|
|
|
public virtual layer_class copy_layer(layer_class layer, bool copy_filter, bool loop)
|
|
{
|
|
GameObject gameObject = new GameObject();
|
|
save_template save_template2 = (save_template)gameObject.AddComponent(typeof(save_template));
|
|
save_template2.layer = layer;
|
|
GameObject gameObject2 = UnityEngine.Object.Instantiate(gameObject);
|
|
UnityEngine.Object.DestroyImmediate(gameObject);
|
|
save_template2 = (save_template)gameObject2.GetComponent(typeof(save_template));
|
|
layer = save_template2.layer;
|
|
UnityEngine.Object.DestroyImmediate(gameObject2);
|
|
if (copy_filter)
|
|
{
|
|
save_template2.layer.prefilter = copy_prefilter(layer.prefilter);
|
|
for (int i = 0; i < layer.tree_output.tree.Count; i++)
|
|
{
|
|
save_template2.layer.tree_output.tree[i].prefilter = copy_prefilter(layer.tree_output.tree[i].prefilter);
|
|
}
|
|
}
|
|
layer.text_placed = string.Empty;
|
|
if (loop)
|
|
{
|
|
loop_layer(layer, 1);
|
|
}
|
|
layer.swap_text = "S";
|
|
layer.swap_select = false;
|
|
layer.copy_select = false;
|
|
layer.color_layer = new Color(2f, 2f, 2f, 1f);
|
|
return layer;
|
|
}
|
|
|
|
public virtual void save_loop_layer(int prelayer_number, int layer_number, int prelayer_number_save, int layer_number_save, save_template script3)
|
|
{
|
|
script3.prelayers[prelayer_number_save].layer[layer_number_save].swap_text = "S";
|
|
script3.prelayers[prelayer_number_save].layer[layer_number_save].swap_select = false;
|
|
script3.prelayers[prelayer_number_save].layer[layer_number_save].copy_select = false;
|
|
for (int i = 0; i < prelayers[prelayer_number].layer[layer_number].prefilter.filter_index.Count; i++)
|
|
{
|
|
script3.filters.Add(copy_filter(filter[prelayers[prelayer_number].layer[layer_number].prefilter.filter_index[i]], false));
|
|
script3.prelayers[prelayer_number_save].layer[layer_number_save].prefilter.filter_index[i] = script3.filters.Count - 1;
|
|
for (int j = 0; j < filter[prelayers[prelayer_number].layer[layer_number].prefilter.filter_index[i]].presubfilter.subfilter_index.Count; j++)
|
|
{
|
|
script3.subfilters.Add(copy_subfilter(subfilter[filter[prelayers[prelayer_number].layer[layer_number].prefilter.filter_index[i]].presubfilter.subfilter_index[j]]));
|
|
script3.filters[script3.filters.Count - 1].presubfilter.subfilter_index[j] = script3.subfilters.Count - 1;
|
|
}
|
|
}
|
|
for (int k = 0; k < prelayers[prelayer_number].layer[layer_number].tree_output.tree.Count; k++)
|
|
{
|
|
for (int i = 0; i < prelayers[prelayer_number].layer[layer_number].tree_output.tree[k].prefilter.filter_index.Count; i++)
|
|
{
|
|
script3.filters.Add(copy_filter(filter[prelayers[prelayer_number].layer[layer_number].tree_output.tree[k].prefilter.filter_index[i]], false));
|
|
script3.prelayers[prelayer_number_save].layer[layer_number_save].tree_output.tree[k].prefilter.filter_index[i] = script3.filters.Count - 1;
|
|
for (int j = 0; j < filter[prelayers[prelayer_number].layer[layer_number].tree_output.tree[k].prefilter.filter_index[i]].presubfilter.subfilter_index.Count; j++)
|
|
{
|
|
script3.subfilters.Add(copy_subfilter(subfilter[filter[prelayers[prelayer_number].layer[layer_number].tree_output.tree[k].prefilter.filter_index[i]].presubfilter.subfilter_index[j]]));
|
|
script3.filters[script3.filters.Count - 1].presubfilter.subfilter_index[j] = script3.subfilters.Count - 1;
|
|
}
|
|
}
|
|
}
|
|
for (int l = 0; l < prelayers[prelayer_number].layer[layer_number].object_output.@object.Count; l++)
|
|
{
|
|
if (prelayers[prelayer_number].layer[layer_number].object_output.@object[l].prelayer_created)
|
|
{
|
|
script3.prelayers.Add(copy_prelayer(prelayers[prelayers[prelayer_number].layer[layer_number].object_output.@object[l].prelayer_index], false));
|
|
script3.prelayers[prelayer_number_save].layer[layer_number_save].object_output.@object[l].prelayer_index = script3.prelayers.Count - 1;
|
|
for (int m = 0; m < prelayers[prelayers[prelayer_number].layer[layer_number].object_output.@object[l].prelayer_index].layer.Count; m++)
|
|
{
|
|
save_loop_layer(prelayers[prelayer_number].layer[layer_number].object_output.@object[l].prelayer_index, m, prelayer_number_save + 1, m, script3);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void load_loop_layer(int prelayer_number, int layer_number, int prelayer_number_load, int layer_number_load, save_template script3)
|
|
{
|
|
for (int i = 0; i < script3.prelayers[prelayer_number_load].layer[layer_number_load].prefilter.filter_index.Count; i++)
|
|
{
|
|
filter.Add(copy_filter(script3.filters[script3.prelayers[prelayer_number_load].layer[layer_number_load].prefilter.filter_index[i]], false));
|
|
prelayers[prelayer_number].layer[layer_number].prefilter.filter_index[i] = filter.Count - 1;
|
|
for (int j = 0; j < filter[filter.Count - 1].presubfilter.subfilter_index.Count; j++)
|
|
{
|
|
subfilter.Add(copy_subfilter(script3.subfilters[filter[filter.Count - 1].presubfilter.subfilter_index[j]]));
|
|
filter[filter.Count - 1].presubfilter.subfilter_index[j] = subfilter.Count - 1;
|
|
}
|
|
}
|
|
for (int k = 0; k < script3.prelayers[prelayer_number_load].layer[layer_number_load].tree_output.tree.Count; k++)
|
|
{
|
|
for (int i = 0; i < script3.prelayers[prelayer_number_load].layer[layer_number_load].tree_output.tree[k].prefilter.filter_index.Count; i++)
|
|
{
|
|
filter.Add(copy_filter(script3.filters[script3.prelayers[prelayer_number_load].layer[layer_number_load].tree_output.tree[k].prefilter.filter_index[i]], false));
|
|
prelayers[prelayer_number].layer[layer_number].tree_output.tree[k].prefilter.filter_index[i] = filter.Count - 1;
|
|
for (int j = 0; j < filter[filter.Count - 1].presubfilter.subfilter_index.Count; j++)
|
|
{
|
|
subfilter.Add(copy_subfilter(script3.subfilters[filter[filter.Count - 1].presubfilter.subfilter_index[j]]));
|
|
filter[filter.Count - 1].presubfilter.subfilter_index[j] = subfilter.Count - 1;
|
|
}
|
|
}
|
|
}
|
|
for (int l = 0; l < script3.prelayers[prelayer_number_load].layer[layer_number_load].object_output.@object.Count; l++)
|
|
{
|
|
if (script3.prelayers[prelayer_number_load].layer[layer_number_load].object_output.@object[l].prelayer_created)
|
|
{
|
|
prelayers.Add(copy_prelayer(script3.prelayers[script3.prelayers[prelayer_number_load].layer[layer_number_load].object_output.@object[l].prelayer_index], false));
|
|
prelayers[prelayer_number].layer[layer_number].object_output.@object[l].prelayer_index = prelayers.Count - 1;
|
|
for (int m = 0; m < script3.prelayers[script3.prelayers[prelayer_number_load].layer[layer_number_load].object_output.@object[l].prelayer_index].layer.Count; m++)
|
|
{
|
|
load_loop_layer(prelayers.Count - 1, m, script3.prelayers[prelayer_number_load].layer[layer_number_load].object_output.@object[l].prelayer_index, m, script3);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void copy_description(prelayer_class prelayer1, int description_number, prelayer_class target_prelayer, int target_description_number)
|
|
{
|
|
target_prelayer.predescription.description[target_description_number].text = prelayer1.predescription.description[description_number].text + "#";
|
|
target_prelayer.predescription.description[target_description_number].edit = prelayer1.predescription.description[description_number].edit;
|
|
target_prelayer.predescription.description[target_description_number].layers_active = prelayer1.predescription.description[description_number].layers_active;
|
|
int num = get_layer_position(0, target_description_number, target_prelayer);
|
|
int count = prelayer1.predescription.description[description_number].layer_index.Count;
|
|
for (int i = 0; i < count; i++)
|
|
{
|
|
add_layer(target_prelayer, num, layer_output_enum.color, target_description_number, 0, false, false, false);
|
|
target_prelayer.layer[num] = copy_layer(prelayer1.layer[prelayer1.predescription.description[description_number].layer_index[count - 1 - i]], true, true);
|
|
}
|
|
count_layers();
|
|
}
|
|
|
|
public virtual prefilter_class copy_prefilter(prefilter_class prefilter)
|
|
{
|
|
prefilter_class prefilter_class2 = new prefilter_class();
|
|
for (int i = 0; i < prefilter.filter_index.Count; i++)
|
|
{
|
|
filter.Add(copy_filter(filter[prefilter.filter_index[i]], true));
|
|
prefilter_class2.filter_index.Add(filter.Count - 1);
|
|
}
|
|
prefilter_class2.set_filter_text();
|
|
return prefilter_class2;
|
|
}
|
|
|
|
public virtual filter_class copy_filter(filter_class filter, bool copy_subfilter)
|
|
{
|
|
GameObject gameObject = new GameObject();
|
|
save_template save_template2 = (save_template)gameObject.AddComponent(typeof(save_template));
|
|
save_template2.filter = filter;
|
|
GameObject gameObject2 = UnityEngine.Object.Instantiate(gameObject);
|
|
UnityEngine.Object.DestroyImmediate(gameObject);
|
|
save_template2 = (save_template)gameObject2.GetComponent(typeof(save_template));
|
|
filter = save_template2.filter;
|
|
UnityEngine.Object.DestroyImmediate(gameObject2);
|
|
if (copy_subfilter)
|
|
{
|
|
for (int i = default(int); i < filter.presubfilter.subfilter_index.Count; i++)
|
|
{
|
|
subfilter.Add(this.copy_subfilter(subfilter[filter.presubfilter.subfilter_index[i]]));
|
|
filter.presubfilter.subfilter_index[i] = subfilter.Count - 1;
|
|
}
|
|
}
|
|
for (int j = 0; j < filter.preimage.precolor_range.color_range.Count; j++)
|
|
{
|
|
filter.preimage.precolor_range.color_range[j].swap_text = "S";
|
|
filter.preimage.precolor_range.color_range[j].swap_select = false;
|
|
filter.preimage.precolor_range.color_range[j].copy_select = false;
|
|
}
|
|
filter.swap_text = "S";
|
|
filter.swap_select = false;
|
|
filter.copy_select = false;
|
|
filter.prerandom_curve.curve_text = "Curve";
|
|
filter.precurve_x_left.curve_text = "Curve";
|
|
filter.precurve_x_right.curve_text = "Curve";
|
|
filter.precurve_z_left.curve_text = "Curve";
|
|
filter.precurve_z_right.curve_text = "Curve";
|
|
filter.color_filter = new Color(2f, 2f, 2f, 1f);
|
|
return filter;
|
|
}
|
|
|
|
public virtual subfilter_class copy_subfilter(subfilter_class subfilter)
|
|
{
|
|
GameObject gameObject = new GameObject();
|
|
save_template save_template2 = (save_template)gameObject.AddComponent(typeof(save_template));
|
|
save_template2.subfilter = subfilter;
|
|
GameObject gameObject2 = UnityEngine.Object.Instantiate(gameObject);
|
|
UnityEngine.Object.DestroyImmediate(gameObject);
|
|
save_template2 = (save_template)gameObject2.GetComponent(typeof(save_template));
|
|
subfilter = save_template2.subfilter;
|
|
UnityEngine.Object.DestroyImmediate(gameObject2);
|
|
subfilter.swap_text = "S";
|
|
subfilter.swap_select = false;
|
|
subfilter.copy_select = false;
|
|
for (int i = 0; i < subfilter.preimage.precolor_range.color_range.Count; i++)
|
|
{
|
|
subfilter.preimage.precolor_range.color_range[i].swap_text = "S";
|
|
subfilter.preimage.precolor_range.color_range[i].swap_select = false;
|
|
subfilter.preimage.precolor_range.color_range[i].copy_select = false;
|
|
}
|
|
subfilter.color_subfilter = new Color(2f, 2f, 2f, 1f);
|
|
return subfilter;
|
|
}
|
|
|
|
public virtual terrain_class copy_terrain(terrain_class preterrain1)
|
|
{
|
|
GameObject gameObject = new GameObject();
|
|
save_template save_template2 = (save_template)gameObject.AddComponent(typeof(save_template));
|
|
save_template2.preterrain = preterrain1;
|
|
GameObject gameObject2 = UnityEngine.Object.Instantiate(gameObject);
|
|
UnityEngine.Object.DestroyImmediate(gameObject);
|
|
save_template2 = (save_template)gameObject2.GetComponent(typeof(save_template));
|
|
preterrain1 = save_template2.preterrain;
|
|
UnityEngine.Object.DestroyImmediate(gameObject2);
|
|
return preterrain1;
|
|
}
|
|
|
|
public virtual splat_custom_class copy_splat_custom(splat_custom_class custom_splat1)
|
|
{
|
|
GameObject gameObject = new GameObject();
|
|
save_template save_template2 = (save_template)gameObject.AddComponent(typeof(save_template));
|
|
save_template2.splat_custom = custom_splat1;
|
|
GameObject gameObject2 = UnityEngine.Object.Instantiate(gameObject);
|
|
UnityEngine.Object.DestroyImmediate(gameObject);
|
|
save_template2 = (save_template)gameObject2.GetComponent(typeof(save_template));
|
|
custom_splat1 = save_template2.splat_custom;
|
|
UnityEngine.Object.DestroyImmediate(gameObject2);
|
|
return custom_splat1;
|
|
}
|
|
|
|
public virtual Terrain copy_terrain2(Terrain terrain1)
|
|
{
|
|
GameObject gameObject = new GameObject();
|
|
save_template save_template2 = (save_template)gameObject.AddComponent(typeof(save_template));
|
|
save_template2.terrain = terrain1;
|
|
GameObject gameObject2 = UnityEngine.Object.Instantiate(gameObject);
|
|
UnityEngine.Object.DestroyImmediate(gameObject);
|
|
save_template2 = (save_template)gameObject2.GetComponent(typeof(save_template));
|
|
terrain1 = save_template2.terrain;
|
|
UnityEngine.Object.DestroyImmediate(gameObject2);
|
|
return terrain1;
|
|
}
|
|
|
|
public virtual animation_curve_class copy_animation_curve(animation_curve_class animation_curve)
|
|
{
|
|
GameObject gameObject = new GameObject();
|
|
save_template save_template2 = (save_template)gameObject.AddComponent(typeof(save_template));
|
|
save_template2.animation_curve = animation_curve;
|
|
GameObject gameObject2 = UnityEngine.Object.Instantiate(gameObject);
|
|
UnityEngine.Object.DestroyImmediate(gameObject);
|
|
save_template2 = (save_template)gameObject2.GetComponent(typeof(save_template));
|
|
animation_curve = save_template2.animation_curve;
|
|
UnityEngine.Object.DestroyImmediate(gameObject2);
|
|
return animation_curve;
|
|
}
|
|
|
|
public virtual color_range_class copy_color_range(color_range_class color_range)
|
|
{
|
|
GameObject gameObject = new GameObject();
|
|
save_template save_template2 = (save_template)gameObject.AddComponent(typeof(save_template));
|
|
save_template2.color_range = color_range;
|
|
GameObject gameObject2 = UnityEngine.Object.Instantiate(gameObject);
|
|
UnityEngine.Object.DestroyImmediate(gameObject);
|
|
save_template2 = (save_template)gameObject2.GetComponent(typeof(save_template));
|
|
color_range = save_template2.color_range;
|
|
UnityEngine.Object.DestroyImmediate(gameObject2);
|
|
color_range.swap_text = "S";
|
|
color_range.swap_select = false;
|
|
color_range.copy_select = false;
|
|
return color_range;
|
|
}
|
|
|
|
public virtual precolor_range_class copy_precolor_range(precolor_range_class precolor_range)
|
|
{
|
|
GameObject gameObject = new GameObject();
|
|
save_template save_template2 = (save_template)gameObject.AddComponent(typeof(save_template));
|
|
save_template2.precolor_range = precolor_range;
|
|
GameObject gameObject2 = UnityEngine.Object.Instantiate(gameObject);
|
|
UnityEngine.Object.DestroyImmediate(gameObject);
|
|
save_template2 = (save_template)gameObject2.GetComponent(typeof(save_template));
|
|
precolor_range = save_template2.precolor_range;
|
|
UnityEngine.Object.DestroyImmediate(gameObject2);
|
|
return precolor_range;
|
|
}
|
|
|
|
public virtual tree_class copy_tree(tree_class tree)
|
|
{
|
|
GameObject gameObject = new GameObject();
|
|
save_template save_template2 = (save_template)gameObject.AddComponent(typeof(save_template));
|
|
save_template2.tree = tree;
|
|
GameObject gameObject2 = UnityEngine.Object.Instantiate(gameObject);
|
|
UnityEngine.Object.DestroyImmediate(gameObject);
|
|
save_template2 = (save_template)gameObject2.GetComponent(typeof(save_template));
|
|
tree = save_template2.tree;
|
|
UnityEngine.Object.DestroyImmediate(gameObject2);
|
|
for (int i = 0; i < tree.prefilter.filter_index.Count; i++)
|
|
{
|
|
filter.Add(copy_filter(filter[tree.prefilter.filter_index[i]], true));
|
|
tree.prefilter.filter_index[i] = filter.Count - 1;
|
|
}
|
|
tree.placed = 0;
|
|
tree.swap_select = false;
|
|
tree.copy_select = false;
|
|
tree.swap_text = "S";
|
|
return tree;
|
|
}
|
|
|
|
public virtual object_class copy_object(object_class object1)
|
|
{
|
|
GameObject gameObject = new GameObject();
|
|
save_template save_template2 = (save_template)gameObject.AddComponent(typeof(save_template));
|
|
save_template2.@object = object1;
|
|
GameObject gameObject2 = UnityEngine.Object.Instantiate(gameObject);
|
|
UnityEngine.Object.DestroyImmediate(gameObject);
|
|
save_template2 = (save_template)gameObject2.GetComponent(typeof(save_template));
|
|
object1 = save_template2.@object;
|
|
UnityEngine.Object.DestroyImmediate(gameObject2);
|
|
object1.color_object = new Color(2f, 2f, 2f, 1f);
|
|
object1.swap_text = "S";
|
|
object1.swap_select = false;
|
|
object1.copy_select = false;
|
|
object1.placed = 0;
|
|
return object1;
|
|
}
|
|
|
|
public virtual int check_terrains_same_resolution()
|
|
{
|
|
int num = 0;
|
|
int result;
|
|
while (true)
|
|
{
|
|
if (num < terrains.Count)
|
|
{
|
|
if (!terrains[num].terrain)
|
|
{
|
|
result = -2;
|
|
break;
|
|
}
|
|
if (!terrains[num].terrain.terrainData)
|
|
{
|
|
result = -2;
|
|
break;
|
|
}
|
|
if (terrains[num].terrain.terrainData.heightmapResolution != terrains[0].terrain.terrainData.heightmapResolution)
|
|
{
|
|
result = -1;
|
|
break;
|
|
}
|
|
num++;
|
|
continue;
|
|
}
|
|
result = 1;
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual bool stitch_terrains(float border_influence)
|
|
{
|
|
float num = Mathf.Round(border_influence / terrains[0].heightmap_conversion.x);
|
|
float num2 = Mathf.Round(border_influence / terrains[0].heightmap_conversion.y);
|
|
int result;
|
|
if (!(border_influence >= terrains[0].heightmap_conversion.x * 1.5f))
|
|
{
|
|
result = 0;
|
|
}
|
|
else
|
|
{
|
|
float num3 = stitch_tool_strength;
|
|
int num4 = default(int);
|
|
int num5 = default(int);
|
|
int num6 = default(int);
|
|
float num7 = default(float);
|
|
float num8 = default(float);
|
|
float[,] array = null;
|
|
float[,] array2 = null;
|
|
float num9 = default(float);
|
|
float num10 = default(float);
|
|
float num11 = default(float);
|
|
float num12 = default(float);
|
|
float num13 = default(float);
|
|
float num14 = default(float);
|
|
float num15 = default(float);
|
|
float num16 = default(float);
|
|
float num17 = default(float);
|
|
float num18 = default(float);
|
|
float num19 = default(float);
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
num5 = -1;
|
|
num6 = -1;
|
|
for (num4 = 0; num4 < terrains.Count; num4++)
|
|
{
|
|
if (num4 != i)
|
|
{
|
|
if (terrains[num4].rect.Contains(new Vector2(terrains[i].rect.center.x, terrains[i].rect.yMax + terrains[i].heightmap_conversion.y)) && num5 == -1)
|
|
{
|
|
num5 = num4;
|
|
}
|
|
if (terrains[num4].rect.Contains(new Vector2(terrains[i].rect.xMin - terrains[i].heightmap_conversion.x, terrains[i].rect.center.y)) && num6 == -1)
|
|
{
|
|
num6 = num4;
|
|
}
|
|
}
|
|
}
|
|
if (num5 != -1)
|
|
{
|
|
array = terrains[i].terrain.terrainData.GetHeights(0, (int)(terrains[i].heightmap_resolution - num2), (int)terrains[i].heightmap_resolution, (int)num2);
|
|
array2 = terrains[num5].terrain.terrainData.GetHeights(0, 0, (int)terrains[i].heightmap_resolution, (int)num2);
|
|
for (int j = 0; (float)j < terrains[i].heightmap_resolution; j++)
|
|
{
|
|
num12 = array[0, j];
|
|
num13 = array2[(int)(num2 - 1f), j];
|
|
for (num8 = 0f; num8 < num2 - 1f; num8 += 1f)
|
|
{
|
|
if (num8 == 0f)
|
|
{
|
|
num10 = array[(int)(num2 - num8 - 1f), j];
|
|
num11 = array2[(int)num8, j];
|
|
num9 = (num12 + num13) / 2f;
|
|
num14 = (num12 - num9) / (num2 - 1f);
|
|
num15 = (num13 - num9) / (num2 - 1f);
|
|
array[(int)(num2 - num8 - 1f), j] = num9;
|
|
array2[(int)num8, j] = num9;
|
|
}
|
|
else
|
|
{
|
|
array[(int)(num2 - num8 - 1f), j] = num9 + num14 * num8;
|
|
array2[(int)num8, j] = num9 + num15 * num8;
|
|
}
|
|
}
|
|
}
|
|
terrains[i].terrain.terrainData.SetHeights(0, (int)(terrains[i].heightmap_resolution - num2), array);
|
|
terrains[num5].terrain.terrainData.SetHeights(0, 0, array2);
|
|
}
|
|
if (num6 != -1)
|
|
{
|
|
array = terrains[i].terrain.terrainData.GetHeights(0, 0, (int)num, (int)terrains[i].heightmap_resolution);
|
|
array2 = terrains[num6].terrain.terrainData.GetHeights((int)(terrains[i].heightmap_resolution - num), 0, (int)num, (int)terrains[i].heightmap_resolution);
|
|
for (int k = 0; (float)k < terrains[i].heightmap_resolution; k++)
|
|
{
|
|
num12 = array[k, (int)(num - 1f)];
|
|
num13 = array2[k, 0];
|
|
for (num7 = 0f; num7 < num - 1f; num7 += 1f)
|
|
{
|
|
if (num7 == 0f)
|
|
{
|
|
num10 = array[k, (int)num7];
|
|
num11 = array2[k, (int)(num - num7 - 1f)];
|
|
num9 = (num12 + num13) / 2f;
|
|
num14 = (num12 - num9) / (num - 1f);
|
|
num15 = (num13 - num9) / (num - 1f);
|
|
array[k, (int)num7] = num9;
|
|
array2[k, (int)(num - num7 - 1f)] = num9;
|
|
}
|
|
else
|
|
{
|
|
array[k, (int)num7] = num9 + num14 * num7;
|
|
array2[k, (int)(num - num7 - 1f)] = num9 + num15 * num7;
|
|
}
|
|
}
|
|
}
|
|
terrains[i].terrain.terrainData.SetHeights(0, 0, array);
|
|
terrains[num6].terrain.terrainData.SetHeights((int)(terrains[i].heightmap_resolution - num), 0, array2);
|
|
}
|
|
if (!(terrains[i].color_terrain[0] >= 1.5f))
|
|
{
|
|
terrains[i].color_terrain = terrains[i].color_terrain + new Color(0.5f, 0.5f, 1f, 0.5f);
|
|
}
|
|
}
|
|
result = 1;
|
|
}
|
|
return (byte)result != 0;
|
|
}
|
|
|
|
public virtual void stitch_splatmap()
|
|
{
|
|
if (terrains.Count < 2)
|
|
{
|
|
return;
|
|
}
|
|
float[,,] array = null;
|
|
int num = default(int);
|
|
int num2 = default(int);
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
num = search_terrain_top(terrains[i]);
|
|
if (num != -1)
|
|
{
|
|
num2 = terrains[num].terrain.terrainData.alphamapResolution;
|
|
if (terrains[i].terrain.terrainData.alphamapResolution != num2 || terrains[i].terrain.terrainData.splatPrototypes.Length != terrains[num].terrain.terrainData.splatPrototypes.Length)
|
|
{
|
|
continue;
|
|
}
|
|
array = terrains[num].terrain.terrainData.GetAlphamaps(0, 0, num2, 1);
|
|
terrains[i].terrain.terrainData.SetAlphamaps(0, num2 - 1, array);
|
|
}
|
|
num = search_terrain_left(terrains[i]);
|
|
if (num != -1)
|
|
{
|
|
num2 = terrains[num].terrain.terrainData.alphamapResolution;
|
|
if (terrains[i].terrain.terrainData.alphamapResolution == num2 && terrains[i].terrain.terrainData.splatPrototypes.Length == terrains[num].terrain.terrainData.splatPrototypes.Length)
|
|
{
|
|
array = terrains[num].terrain.terrainData.GetAlphamaps(num2 - 1, 0, 1, num2);
|
|
terrains[i].terrain.terrainData.SetAlphamaps(0, 0, array);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual int search_terrain_top(terrain_class preterrain1)
|
|
{
|
|
int result;
|
|
if (preterrain1.terrain == null)
|
|
{
|
|
result = -1;
|
|
}
|
|
else if (preterrain1.terrain.terrainData == null)
|
|
{
|
|
result = -1;
|
|
}
|
|
else
|
|
{
|
|
int num = 0;
|
|
while (true)
|
|
{
|
|
if (num < terrains.Count)
|
|
{
|
|
if (!(terrains[num].terrain == null) && !(terrains[num].terrain.terrainData == null) && terrains[num].terrain.transform.position.x == preterrain1.terrain.transform.position.x && terrains[num].terrain.transform.position.z == preterrain1.terrain.transform.position.z + preterrain1.terrain.terrainData.size.z)
|
|
{
|
|
result = num;
|
|
break;
|
|
}
|
|
num++;
|
|
continue;
|
|
}
|
|
result = -1;
|
|
break;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual int search_terrain_left(terrain_class preterrain1)
|
|
{
|
|
int result;
|
|
if (preterrain1.terrain == null)
|
|
{
|
|
result = -1;
|
|
}
|
|
else if (preterrain1.terrain.terrainData == null)
|
|
{
|
|
result = -1;
|
|
}
|
|
else
|
|
{
|
|
int num = 0;
|
|
while (true)
|
|
{
|
|
if (num < terrains.Count)
|
|
{
|
|
if (!(terrains[num].terrain == null) && !(terrains[num].terrain.terrainData == null) && terrains[num].terrain.transform.position.z == preterrain1.terrain.transform.position.z && terrains[num].terrain.transform.position.x == preterrain1.terrain.transform.position.x - preterrain1.terrain.terrainData.size.x)
|
|
{
|
|
result = num;
|
|
break;
|
|
}
|
|
num++;
|
|
continue;
|
|
}
|
|
result = -1;
|
|
break;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual void smooth_terrain(terrain_class preterrain1, float strength)
|
|
{
|
|
if (!preterrain1.terrain)
|
|
{
|
|
return;
|
|
}
|
|
int heightmapResolution = preterrain1.terrain.terrainData.heightmapResolution;
|
|
float num = default(float);
|
|
float num2 = default(float);
|
|
float num3 = 1f;
|
|
float num4 = 1f;
|
|
float num5 = 0f;
|
|
int num6 = 0;
|
|
float num7 = default(float);
|
|
float num8 = default(float);
|
|
float num9 = default(float);
|
|
heights = preterrain1.terrain.terrainData.GetHeights(0, 0, heightmapResolution, heightmapResolution);
|
|
for (int i = 0; i < smooth_tool_repeat; i++)
|
|
{
|
|
for (int j = 0; j < heightmapResolution; j++)
|
|
{
|
|
for (int k = 1; k < heightmapResolution - 1; k++)
|
|
{
|
|
num2 = heights[k - 1, j];
|
|
num7 = heights[k, j];
|
|
num8 = heights[k + 1, j];
|
|
num = num7 - (num2 + num8) / 2f;
|
|
if (smooth_tool_advanced)
|
|
{
|
|
num3 = smooth_tool_height_curve.curve.Evaluate(num7);
|
|
num4 = smooth_tool_angle_curve.curve.Evaluate(calc_terrain_angle(preterrain1, k, j, settings.smooth_angle) / 90f);
|
|
}
|
|
num *= 1f - strength * num3 * num4;
|
|
num9 = num + (num2 + num8) / 2f;
|
|
heights[k, j] = num9;
|
|
}
|
|
}
|
|
for (int j = 1; j < heightmapResolution - 1; j++)
|
|
{
|
|
for (int k = 0; k < heightmapResolution; k++)
|
|
{
|
|
num2 = heights[k, j - 1];
|
|
num7 = heights[k, j];
|
|
num8 = heights[k, j + 1];
|
|
num = num7 - (num2 + num8) / 2f;
|
|
if (smooth_tool_advanced)
|
|
{
|
|
num3 = smooth_tool_height_curve.curve.Evaluate(num7);
|
|
num4 = smooth_tool_angle_curve.curve.Evaluate(calc_terrain_angle(preterrain1, k, j, settings.smooth_angle) / 90f);
|
|
}
|
|
num *= 1f - strength * num3 * num4;
|
|
num9 = num + (num2 + num8) / 2f;
|
|
heights[k, j] = num9;
|
|
}
|
|
}
|
|
}
|
|
preterrain1.terrain.terrainData.SetHeights(0, 0, heights);
|
|
if (!(preterrain1.color_terrain[0] >= 1.5f))
|
|
{
|
|
preterrain1.color_terrain += new Color(0.5f, 0.5f, 1f, 0.5f);
|
|
}
|
|
}
|
|
|
|
public virtual void get_terrains_minmax()
|
|
{
|
|
float num = default(float);
|
|
float num2 = default(float);
|
|
float num3 = default(float);
|
|
Vector3 vector = default(Vector3);
|
|
settings.terrainMinHeight = 100000000f;
|
|
settings.terrainMaxHeight = 0f;
|
|
settings.terrainMinDegree = 100f;
|
|
settings.terrainMaxDegree = 0f;
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if (!terrains[i].terrain || !terrains[i].terrain.terrainData)
|
|
{
|
|
continue;
|
|
}
|
|
num = terrains[i].terrain.terrainData.heightmapResolution;
|
|
vector = terrains[i].terrain.terrainData.size;
|
|
for (int j = 0; (float)j < num; j++)
|
|
{
|
|
for (int k = 0; (float)k < num; k++)
|
|
{
|
|
num2 = terrains[i].terrain.terrainData.GetHeight(k, j);
|
|
if (!(num2 >= settings.terrainMinHeight))
|
|
{
|
|
settings.terrainMinHeight = num2;
|
|
}
|
|
if (!(num2 <= settings.terrainMaxHeight))
|
|
{
|
|
settings.terrainMaxHeight = num2;
|
|
}
|
|
num3 = calc_terrain_angle(terrains[i], (float)k / num * vector.x, (float)j / num * vector.z, settings.smooth_angle);
|
|
if (!(num3 >= settings.terrainMinDegree))
|
|
{
|
|
settings.terrainMinDegree = num3;
|
|
}
|
|
if (!(num3 <= settings.terrainMaxDegree))
|
|
{
|
|
settings.terrainMaxDegree = num3;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void get_meshes_minmax_height()
|
|
{
|
|
settings.terrainMinHeight = 100000000f;
|
|
settings.terrainMaxHeight = 0f;
|
|
settings.terrainMinDegree = 0f;
|
|
settings.terrainMaxDegree = 0f;
|
|
for (int i = 0; i < meshes.Count; i++)
|
|
{
|
|
if ((bool)meshes[i].mesh)
|
|
{
|
|
if (!(meshes[i].mesh.bounds.min.y >= settings.terrainMinHeight))
|
|
{
|
|
settings.terrainMinHeight = meshes[i].mesh.bounds.min.y;
|
|
}
|
|
if (!(meshes[i].mesh.bounds.max.y <= settings.terrainMaxHeight))
|
|
{
|
|
settings.terrainMaxHeight = meshes[i].mesh.bounds.max.y;
|
|
}
|
|
}
|
|
}
|
|
meshes_heightscale = settings.terrainMaxHeight;
|
|
}
|
|
|
|
public virtual void smooth_all_terrain(float strength)
|
|
{
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if (terrains[i].active)
|
|
{
|
|
smooth_terrain(terrains[i], strength);
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void set_smooth_tool_terrain_popup()
|
|
{
|
|
if (terrains.Count > 1)
|
|
{
|
|
smooth_tool_terrain = new string[terrains.Count + 1];
|
|
smooth_tool_terrain[terrains.Count] = "All";
|
|
smooth_tool_terrain_select = terrains.Count;
|
|
}
|
|
else
|
|
{
|
|
smooth_tool_terrain = new string[1];
|
|
smooth_tool_terrain_select = 0;
|
|
}
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
smooth_tool_terrain[i] = terrains[i].name;
|
|
}
|
|
}
|
|
|
|
public virtual void convert_software_version()
|
|
{
|
|
if (!(converted_version >= 1.04f))
|
|
{
|
|
int num = 0;
|
|
for (int i = 0; i < prelayers.Count; i++)
|
|
{
|
|
for (int j = 0; j < prelayers[i].layer.Count; j++)
|
|
{
|
|
for (int k = 0; k < prelayers[i].layer[j].color_output.precolor_range.Count; k++)
|
|
{
|
|
convert_precolor_range(prelayers[i].layer[j].color_output.precolor_range[k]);
|
|
}
|
|
}
|
|
}
|
|
for (int l = 0; l < filter.Count; l++)
|
|
{
|
|
convert_precolor_range(filter[l].preimage.precolor_range);
|
|
}
|
|
for (int m = 0; m < subfilter.Count; m++)
|
|
{
|
|
convert_precolor_range(subfilter[m].preimage.precolor_range);
|
|
}
|
|
converted_version = 1.04f;
|
|
}
|
|
if (converted_version >= 1.8f)
|
|
{
|
|
return;
|
|
}
|
|
for (int n = 0; n < prelayers.Count; n++)
|
|
{
|
|
for (int num2 = 0; num2 < prelayers[n].layer.Count; num2++)
|
|
{
|
|
prelayers[n].layer[num2].splat_output.splat_value.SyncValueMulti();
|
|
prelayers[n].layer[num2].grass_output.grass_value.SyncValueMulti();
|
|
prelayers[n].layer[num2].tree_output.tree_value.SyncValueMulti();
|
|
prelayers[n].layer[num2].object_output.object_value.SyncValueMulti();
|
|
}
|
|
}
|
|
SyncSplatCustom();
|
|
converted_version = 1.8f;
|
|
}
|
|
|
|
public virtual void SyncSplatCustom()
|
|
{
|
|
for (int i = 0; i < prelayers.Count; i++)
|
|
{
|
|
for (int j = 0; j < prelayers[i].layer.Count; j++)
|
|
{
|
|
prelayers[i].layer[j].splat_output.SyncSplatCustom(terrains[0].splatPrototypes.Count);
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void convert_precolor_range(precolor_range_class precolor_range)
|
|
{
|
|
precolor_range.color_range_value.calc_value();
|
|
}
|
|
|
|
public virtual void filter_texture(int previewMode)
|
|
{
|
|
if (!texture_tool.preimage.image[0])
|
|
{
|
|
return;
|
|
}
|
|
int width = texture_tool.preimage.image[0].width;
|
|
int num = texture_tool.preimage.image[0].height;
|
|
if (texture_tool.preimage.image.Count == 1)
|
|
{
|
|
texture_tool.preimage.image.Add(new Texture2D(1, 1));
|
|
}
|
|
if (!texture_tool.preimage.image[1])
|
|
{
|
|
texture_tool.preimage.image[1] = new Texture2D(1, 1);
|
|
}
|
|
if ((float)texture_tool.preimage.image[1].width != texture_tool.resolution_display.x || (float)texture_tool.preimage.image[1].height != texture_tool.resolution_display.x)
|
|
{
|
|
texture_tool.preimage.image[1].Resize((int)texture_tool.resolution_display.x, (int)texture_tool.resolution_display.y);
|
|
}
|
|
int width2 = texture_tool.preimage.image[1].width;
|
|
int num2 = texture_tool.preimage.image[1].height;
|
|
Vector2 vector = new Vector2(width / width2, num / num2);
|
|
int count = texture_tool.precolor_range.color_range.Count;
|
|
bool flag = false;
|
|
Color color = default(Color);
|
|
Color color2 = default(Color);
|
|
Color color3 = default(Color);
|
|
for (int i = 0; i < num2; i++)
|
|
{
|
|
for (int j = 0; j < width2; j++)
|
|
{
|
|
flag = false;
|
|
color3 = texture_tool.preimage.image[0].GetPixel((int)((float)j * vector.x), (int)((float)i * vector.y));
|
|
for (int k = 0; k < count; k++)
|
|
{
|
|
if (!texture_tool.precolor_range.color_range_value.active[k])
|
|
{
|
|
continue;
|
|
}
|
|
color = texture_tool.precolor_range.color_range[k].color_start;
|
|
color2 = texture_tool.precolor_range.color_range[k].color_end;
|
|
if (texture_tool.precolor_range.color_range[k].one_color)
|
|
{
|
|
if (color3 == color)
|
|
{
|
|
flag = true;
|
|
if ((previewMode & 1) != 0)
|
|
{
|
|
color3 = choose_color(k, 1f);
|
|
}
|
|
}
|
|
}
|
|
else if (color_in_range(color3, color, color2))
|
|
{
|
|
if (!texture_tool.precolor_range.color_range[k].invert)
|
|
{
|
|
if ((previewMode & 1) != 0)
|
|
{
|
|
color3 = choose_color(k, texture_tool.precolor_range.color_range[k].curve.Evaluate(calc_color_pos(color3, color, color2)));
|
|
}
|
|
flag = true;
|
|
}
|
|
}
|
|
else if (texture_tool.precolor_range.color_range[k].invert)
|
|
{
|
|
flag = true;
|
|
if ((previewMode & 1) != 0)
|
|
{
|
|
color3 = choose_color(k, 1f - texture_tool.precolor_range.color_range[k].curve.Evaluate(calc_color_pos(color3, color, color2)));
|
|
}
|
|
}
|
|
}
|
|
if (!flag && (previewMode & 2) == 0)
|
|
{
|
|
color3 = new Color(0f, 0f, 0f);
|
|
}
|
|
texture_tool.preimage.image[1].SetPixel(j, i, color3);
|
|
}
|
|
}
|
|
texture_tool.preimage.image[1].Apply();
|
|
}
|
|
|
|
public virtual Color choose_color(int index, float falloff)
|
|
{
|
|
Color result = Color.red;
|
|
switch (index)
|
|
{
|
|
case 0:
|
|
result = Color.red * falloff;
|
|
break;
|
|
case 1:
|
|
result = Color.green * falloff;
|
|
break;
|
|
case 2:
|
|
result = Color.blue * falloff;
|
|
break;
|
|
case 3:
|
|
result = Color.yellow * falloff;
|
|
break;
|
|
case 4:
|
|
result = Color.white * falloff;
|
|
break;
|
|
case 5:
|
|
result = Color.cyan * falloff;
|
|
break;
|
|
case 6:
|
|
result = Color.magenta * falloff;
|
|
break;
|
|
case 7:
|
|
result = Color.grey * falloff;
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual AnimationCurve set_curve_linear(AnimationCurve curve)
|
|
{
|
|
AnimationCurve animationCurve = new AnimationCurve();
|
|
for (int i = 0; i < curve.keys.Length; i++)
|
|
{
|
|
float inTangent = 0f;
|
|
float outTangent = 0f;
|
|
bool flag = false;
|
|
bool flag2 = false;
|
|
Vector2 vector = default(Vector2);
|
|
Vector2 vector2 = default(Vector2);
|
|
Vector2 vector3 = default(Vector2);
|
|
Keyframe key = curve[i];
|
|
if (i == 0)
|
|
{
|
|
inTangent = 0f;
|
|
flag = true;
|
|
}
|
|
if (i == curve.keys.Length - 1)
|
|
{
|
|
outTangent = 0f;
|
|
flag2 = true;
|
|
}
|
|
if (!flag)
|
|
{
|
|
vector.x = curve.keys[i - 1].time;
|
|
vector.y = curve.keys[i - 1].value;
|
|
vector2.x = curve.keys[i].time;
|
|
vector2.y = curve.keys[i].value;
|
|
vector3 = vector2 - vector;
|
|
inTangent = vector3.y / vector3.x;
|
|
}
|
|
if (!flag2)
|
|
{
|
|
vector.x = curve.keys[i].time;
|
|
vector.y = curve.keys[i].value;
|
|
vector2.x = curve.keys[i + 1].time;
|
|
vector2.y = curve.keys[i + 1].value;
|
|
vector3 = vector2 - vector;
|
|
outTangent = vector3.y / vector3.x;
|
|
}
|
|
key.inTangent = inTangent;
|
|
key.outTangent = outTangent;
|
|
animationCurve.AddKey(key);
|
|
}
|
|
return animationCurve;
|
|
}
|
|
|
|
public virtual float perlin_noise(float x, float y, float offset_x, float offset_y, float frequency, float octaves, float detail_strength)
|
|
{
|
|
frequency *= current_layer.zoom;
|
|
offset_x += current_layer.offset.x;
|
|
offset_y += current_layer.offset.y;
|
|
float num = Mathf.PerlinNoise((x + frequency * (offset_x + 50f)) / frequency, (y + frequency * (offset_y + 50f)) / frequency);
|
|
float num2 = 2f;
|
|
for (float num3 = 1f; num3 < octaves; num3 += 1f)
|
|
{
|
|
num += (Mathf.PerlinNoise((x + frequency * (offset_x + 50f)) / (frequency / num2), (y + frequency * (offset_y + 50f)) / (frequency / num2)) - 0.5f) / num2;
|
|
num2 *= detail_strength;
|
|
}
|
|
return num;
|
|
}
|
|
|
|
public virtual float clamp_range(float number, float start, float end)
|
|
{
|
|
return (end - start) * number + start;
|
|
}
|
|
|
|
public virtual void create_perlin(int preview_resolution, int resolution, export_mode_enum mode, bool save)
|
|
{
|
|
float num = (float)resolution * 1f / ((float)preview_resolution * 1f);
|
|
int num2 = default(int);
|
|
float num3 = default(float);
|
|
float num4 = default(float);
|
|
float num5 = default(float);
|
|
int num6 = preview_resolution * preview_resolution;
|
|
int num7 = default(int);
|
|
float frequency = heightmap_tool.perlin.frequency;
|
|
switch (mode)
|
|
{
|
|
case export_mode_enum.Image:
|
|
{
|
|
Color[] array = default(Color[]);
|
|
if (mode == export_mode_enum.Image)
|
|
{
|
|
array = new Color[num6];
|
|
}
|
|
Color color = default(Color);
|
|
for (num3 = 0f; num3 < (float)resolution; num3 += num)
|
|
{
|
|
for (num4 = 0f; num4 < (float)resolution; num4 += num)
|
|
{
|
|
color[0] = Mathf.PerlinNoise(((float)(-(resolution / 2)) + num4 + frequency * (heightmap_tool.perlin.offset.x + 5000f)) / frequency, ((float)(-(resolution / 2)) + num3 + frequency * (heightmap_tool.perlin.offset.y + 5000f)) / frequency);
|
|
num5 = 2f;
|
|
for (num2 = 1; num2 < heightmap_tool.perlin.octaves; num2++)
|
|
{
|
|
color[0] += (Mathf.PerlinNoise(((float)(-(resolution / 2)) + num4 + frequency * (heightmap_tool.perlin.offset.x + 5000f)) / (frequency / num5), ((float)(-(resolution / 2)) + num3 + frequency * (heightmap_tool.perlin.offset.y + 5000f)) / (frequency / num5)) - 0.5f) / num5;
|
|
num5 *= 2f;
|
|
}
|
|
color[0] = color[0];
|
|
color[1] = color[0];
|
|
color[2] = color[0];
|
|
num7 = (int)(num4 / num + num3 / num * (float)preview_resolution);
|
|
if (num7 > num6 - 1)
|
|
{
|
|
num7 = num6 - 1;
|
|
}
|
|
array[num7] = color;
|
|
}
|
|
}
|
|
if (save)
|
|
{
|
|
if (preview_resolution != heightmap_tool.output_texture.width)
|
|
{
|
|
heightmap_tool.output_texture.Resize(resolution, resolution);
|
|
}
|
|
heightmap_tool.output_texture.SetPixels(array);
|
|
heightmap_tool.output_texture.Apply();
|
|
}
|
|
else
|
|
{
|
|
heightmap_tool.preview_texture.SetPixels(array);
|
|
heightmap_tool.preview_texture.Apply();
|
|
}
|
|
break;
|
|
}
|
|
case export_mode_enum.Raw:
|
|
{
|
|
if (!save)
|
|
{
|
|
break;
|
|
}
|
|
heightmap_tool.raw_save_file.bytes = new byte[resolution * resolution * 2];
|
|
int num8 = 0;
|
|
int num9 = 0;
|
|
int num10 = default(int);
|
|
int num11 = default(int);
|
|
int num12 = 0;
|
|
ushort num13 = default(ushort);
|
|
float num14 = default(float);
|
|
if (heightmap_tool.raw_save_file.mode == raw_mode_enum.Mac)
|
|
{
|
|
for (num4 = 0f; num4 < (float)resolution; num4 += 1f)
|
|
{
|
|
for (num3 = 0f; num3 < (float)resolution; num3 += 1f)
|
|
{
|
|
num14 = Mathf.PerlinNoise((num4 + heightmap_tool.perlin.offset.x + 1000000f) / heightmap_tool.perlin.frequency, (num3 + heightmap_tool.perlin.offset.y + 1000000f) / heightmap_tool.perlin.frequency);
|
|
num5 = 2f;
|
|
for (num2 = 1; num2 < heightmap_tool.perlin.octaves; num2++)
|
|
{
|
|
num14 += (Mathf.PerlinNoise((num4 + heightmap_tool.perlin.offset.x + 1000000f) / (heightmap_tool.perlin.frequency / num5), (num3 + heightmap_tool.perlin.offset.y + 1000000f) / (heightmap_tool.perlin.frequency / num5)) - 0.5f) / num5;
|
|
num5 *= 2f;
|
|
}
|
|
num14 = heightmap_tool.perlin.precurve.curve.Evaluate(num14) * 65535f;
|
|
if (!(num14 >= 0f))
|
|
{
|
|
num14 = 0f;
|
|
}
|
|
if (!(num14 <= 65535f))
|
|
{
|
|
num14 = 65535f;
|
|
}
|
|
num13 = (ushort)num14;
|
|
num10 = (int)((uint)num13 >> 8);
|
|
num11 = num13 - (num10 << 8);
|
|
heightmap_tool.raw_save_file.bytes[num12++] = (byte)num10;
|
|
heightmap_tool.raw_save_file.bytes[num12++] = (byte)num11;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (heightmap_tool.raw_save_file.mode != raw_mode_enum.Windows)
|
|
{
|
|
break;
|
|
}
|
|
for (num4 = 0f; num4 < (float)resolution; num4 += 1f)
|
|
{
|
|
for (num3 = 0f; num3 < (float)resolution; num3 += 1f)
|
|
{
|
|
num14 = Mathf.PerlinNoise((num4 + heightmap_tool.perlin.offset.x + 1000000f) / heightmap_tool.perlin.frequency, (num3 + heightmap_tool.perlin.offset.y + 1000000f) / heightmap_tool.perlin.frequency);
|
|
num5 = 2f;
|
|
for (num2 = 1; num2 < heightmap_tool.perlin.octaves; num2++)
|
|
{
|
|
num14 += (Mathf.PerlinNoise((num4 + heightmap_tool.perlin.offset.x + 1000000f) / (heightmap_tool.perlin.frequency / num5), (num3 + heightmap_tool.perlin.offset.y + 1000000f) / (heightmap_tool.perlin.frequency / num5)) - 0.5f) / num5;
|
|
num5 *= 2f;
|
|
}
|
|
num14 = heightmap_tool.perlin.precurve.curve.Evaluate(num14) * 65535f;
|
|
if (!(num14 >= 0f))
|
|
{
|
|
num14 = 0f;
|
|
}
|
|
if (!(num14 <= 65535f))
|
|
{
|
|
num14 = 65535f;
|
|
}
|
|
num13 = (ushort)num14;
|
|
num10 = (int)((uint)num13 >> 8);
|
|
num11 = num13 - (num10 << 8);
|
|
heightmap_tool.raw_save_file.bytes[num12++] = (byte)num11;
|
|
heightmap_tool.raw_save_file.bytes[num12++] = (byte)num10;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual bool generate_pattern_start()
|
|
{
|
|
if (pattern_tool.clear)
|
|
{
|
|
for (int i = 0; i < pattern_tool.output_texture.height; i++)
|
|
{
|
|
for (int j = 0; j < pattern_tool.output_texture.width; j++)
|
|
{
|
|
pattern_tool.output_texture.SetPixel(j, i, new Color(0f, 0f, 0f));
|
|
}
|
|
}
|
|
}
|
|
pattern_tool.place_total = 0;
|
|
int num = 0;
|
|
int result;
|
|
while (true)
|
|
{
|
|
if (num < pattern_tool.patterns.Count)
|
|
{
|
|
if (!pattern_tool.patterns[num].input_texture)
|
|
{
|
|
result = 0;
|
|
break;
|
|
}
|
|
pattern_tool.patterns[num].pattern_placed.Clear();
|
|
pattern_tool.patterns[num].placed_max = false;
|
|
pattern_tool.place_total += pattern_tool.patterns[num].place_max;
|
|
pattern_tool.patterns[num].width = pattern_tool.patterns[num].input_texture.width / pattern_tool.patterns[num].count_x;
|
|
pattern_tool.patterns[num].height = pattern_tool.patterns[num].input_texture.height / pattern_tool.patterns[num].count_y;
|
|
num++;
|
|
continue;
|
|
}
|
|
result = 1;
|
|
break;
|
|
}
|
|
return (byte)result != 0;
|
|
}
|
|
|
|
public virtual bool generate_pattern()
|
|
{
|
|
bool result = true;
|
|
pick_pattern();
|
|
draw_pattern();
|
|
for (int i = 0; i < pattern_tool.patterns.Count; i++)
|
|
{
|
|
if (!pattern_tool.patterns[i].placed_max && pattern_tool.patterns[i].active)
|
|
{
|
|
result = false;
|
|
}
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual void pick_pattern()
|
|
{
|
|
int num = default(int);
|
|
do
|
|
{
|
|
num = UnityEngine.Random.Range(0, pattern_tool.patterns.Count);
|
|
}
|
|
while (pattern_tool.patterns[num].placed_max || !pattern_tool.patterns[num].active);
|
|
pattern_tool.current_pattern = pattern_tool.patterns[num];
|
|
pattern_tool.current_pattern.current_x = UnityEngine.Random.Range(0, pattern_tool.current_pattern.count_x);
|
|
pattern_tool.current_pattern.current_y = UnityEngine.Random.Range(0, pattern_tool.current_pattern.count_y);
|
|
pattern_tool.current_pattern.rotation = UnityEngine.Random.Range(pattern_tool.current_pattern.rotation_start, pattern_tool.current_pattern.rotation_end);
|
|
pattern_tool.current_pattern.width2 = pattern_tool.current_pattern.width / 2f;
|
|
pattern_tool.current_pattern.height2 = pattern_tool.current_pattern.height / 2f;
|
|
pattern_tool.current_pattern.start_x = pattern_tool.current_pattern.current_x * pattern_tool.current_pattern.width;
|
|
pattern_tool.current_pattern.start_y = pattern_tool.current_pattern.current_y * pattern_tool.current_pattern.height;
|
|
pattern_tool.current_pattern.scale.x = 1f / UnityEngine.Random.Range(pattern_tool.current_pattern.scale_start.x, pattern_tool.current_pattern.scale_end.x);
|
|
float num2 = pattern_tool.current_pattern.scale_end.x - pattern_tool.current_pattern.scale_start.x;
|
|
float num3 = pattern_tool.current_pattern.scale.x - pattern_tool.current_pattern.scale_start.x;
|
|
float num4 = num3 / num2 * 100f;
|
|
pattern_tool.current_pattern.scale.y = pattern_tool.current_pattern.scale.x;
|
|
float num5 = pattern_tool.current_pattern.scale_end.y - pattern_tool.current_pattern.scale_start.y;
|
|
float num6 = pattern_tool.current_pattern.scale.y - pattern_tool.current_pattern.scale_start.y;
|
|
float num7 = num6 / num5 * 100f;
|
|
float num8 = Mathf.Abs(num4 - num7);
|
|
}
|
|
|
|
public virtual void draw_pattern()
|
|
{
|
|
if (pattern_tool.current_pattern.pattern_placed.Count >= pattern_tool.current_pattern.place_max)
|
|
{
|
|
pattern_tool.current_pattern.placed_max = true;
|
|
return;
|
|
}
|
|
Vector2 item = default(Vector2);
|
|
Color color = default(Color);
|
|
Color color2 = default(Color);
|
|
Vector2 vector = default(Vector2);
|
|
Vector2 vector2 = default(Vector2);
|
|
bool flag = false;
|
|
item.x = UnityEngine.Random.Range(0f - pattern_tool.current_pattern.width, pattern_tool.output_texture.width);
|
|
item.y = UnityEngine.Random.Range(0f - pattern_tool.current_pattern.height, pattern_tool.output_texture.height);
|
|
float rotation = pattern_tool.current_pattern.rotation;
|
|
for (float num = 0f; num < pattern_tool.current_pattern.height + pattern_tool.current_pattern.height2; num += pattern_tool.current_pattern.scale.y)
|
|
{
|
|
for (float num2 = 0f; num2 < pattern_tool.current_pattern.width + pattern_tool.current_pattern.width2; num2 += pattern_tool.current_pattern.scale.x)
|
|
{
|
|
vector2.x = num2 / pattern_tool.current_pattern.scale.x + item.x;
|
|
vector2.y = num / pattern_tool.current_pattern.scale.y + item.y;
|
|
if (vector2.x >= pattern_tool.output_resolution.x || vector2.y >= pattern_tool.output_resolution.y || vector2.x < 0f || !(vector2.y >= 0f))
|
|
{
|
|
continue;
|
|
}
|
|
vector.x = num2 + pattern_tool.current_pattern.start_x - pattern_tool.current_pattern.width2 / 2f;
|
|
vector.y = num + pattern_tool.current_pattern.start_y - pattern_tool.current_pattern.height2 / 2f;
|
|
vector = calc_rotation_pixel(vector.x, vector.y, pattern_tool.current_pattern.start_x + pattern_tool.current_pattern.width / 2f, pattern_tool.current_pattern.start_y + pattern_tool.current_pattern.height / 2f, pattern_tool.current_pattern.rotation);
|
|
if (vector.x - pattern_tool.current_pattern.start_x < 0f || !(vector.x - pattern_tool.current_pattern.start_x <= pattern_tool.current_pattern.width) || vector.y - pattern_tool.current_pattern.start_y < 0f || !(vector.y - pattern_tool.current_pattern.start_y <= pattern_tool.current_pattern.height))
|
|
{
|
|
continue;
|
|
}
|
|
color = pattern_tool.current_pattern.input_texture.GetPixel((int)vector.x, (int)vector.y) * pattern_tool.current_pattern.color;
|
|
color[0] *= pattern_tool.current_pattern.strength;
|
|
color[1] *= pattern_tool.current_pattern.strength;
|
|
color[2] *= pattern_tool.current_pattern.strength;
|
|
color2 = pattern_tool.output_texture.GetPixel((int)vector2.x, (int)vector2.y);
|
|
flag = false;
|
|
for (int i = 0; i < pattern_tool.current_pattern.precolor_range.color_range.Count; i++)
|
|
{
|
|
if (color_in_range(color, pattern_tool.current_pattern.precolor_range.color_range[i].color_start, pattern_tool.current_pattern.precolor_range.color_range[i].color_end))
|
|
{
|
|
if (!pattern_tool.current_pattern.precolor_range.color_range[i].invert)
|
|
{
|
|
flag = true;
|
|
}
|
|
}
|
|
else if (pattern_tool.current_pattern.precolor_range.color_range[i].invert)
|
|
{
|
|
flag = true;
|
|
}
|
|
}
|
|
condition_output_enum output = pattern_tool.current_pattern.output;
|
|
switch (output)
|
|
{
|
|
case condition_output_enum.add:
|
|
color += color2;
|
|
break;
|
|
case condition_output_enum.subtract:
|
|
color = color2 - color;
|
|
break;
|
|
case condition_output_enum.multiply:
|
|
color = color2 * color;
|
|
break;
|
|
case condition_output_enum.divide:
|
|
color[0] = color2[0] / color[0];
|
|
color[1] = color2[1] / color[1];
|
|
color[2] = color2[2] / color[2];
|
|
break;
|
|
case condition_output_enum.difference:
|
|
color[0] = Mathf.Abs(color2[0] - color[0]);
|
|
color[1] = Mathf.Abs(color2[1] - color[1]);
|
|
color[2] = Mathf.Abs(color2[2] - color[2]);
|
|
break;
|
|
case condition_output_enum.average:
|
|
color = (color + color2) / 2f;
|
|
break;
|
|
case condition_output_enum.max:
|
|
if (!(color[0] >= color2[0]) && !(color[1] >= color2[1]) && !(color[2] >= color2[2]))
|
|
{
|
|
flag = false;
|
|
}
|
|
break;
|
|
default:
|
|
if (output == condition_output_enum.max && !(color[0] <= color2[0]) && !(color[1] <= color2[1]) && !(color[2] <= color2[2]))
|
|
{
|
|
flag = false;
|
|
}
|
|
break;
|
|
case condition_output_enum.change:
|
|
break;
|
|
}
|
|
if (flag)
|
|
{
|
|
pattern_tool.output_texture.SetPixel((int)vector2.x, (int)vector2.y, color);
|
|
}
|
|
}
|
|
}
|
|
pattern_tool.current_pattern.pattern_placed.Add(item);
|
|
}
|
|
|
|
public virtual float calc_floor(float number)
|
|
{
|
|
int num = (int)number;
|
|
return num;
|
|
}
|
|
|
|
public virtual void normalize_splat(terrain_class preterrain1)
|
|
{
|
|
int length = preterrain1.terrain.terrainData.splatPrototypes.Length;
|
|
preterrain1.map = preterrain1.terrain.terrainData.GetAlphamaps(0, 0, preterrain1.terrain.terrainData.alphamapResolution, preterrain1.terrain.terrainData.alphamapResolution);
|
|
float num = default(float);
|
|
for (int i = 0; (float)i < preterrain.splatmap_resolution; i++)
|
|
{
|
|
for (int j = 0; (float)j < preterrain.splatmap_resolution; j++)
|
|
{
|
|
num = 0f;
|
|
for (int k = 0; k < length; k++)
|
|
{
|
|
num += preterrain1.map[j, i, k];
|
|
}
|
|
for (int k = 0; k < length; k++)
|
|
{
|
|
preterrain1.map[j, i, k] = preterrain1.map[j, i, k] / num;
|
|
}
|
|
}
|
|
}
|
|
preterrain1.terrain.terrainData.SetAlphamaps(0, 0, preterrain1.map);
|
|
}
|
|
|
|
public virtual float calc_terrain_angle(terrain_class preterrain1, float x, float y, int smooth)
|
|
{
|
|
Vector3 size = preterrain1.terrain.terrainData.size;
|
|
float num = preterrain1.terrain.terrainData.heightmapResolution;
|
|
float num2 = size.x / (num - 1f);
|
|
short num3 = (short)(x / num2);
|
|
short num4 = (short)(y / num2);
|
|
bool flag = false;
|
|
short num5 = (short)(num3 - smooth);
|
|
short num6 = (short)(num4 + smooth);
|
|
terrain_class terrain_class3 = preterrain1;
|
|
short num7 = (short)(num3 + smooth);
|
|
short num8 = (short)(num4 + smooth);
|
|
terrain_class terrain_class4 = preterrain1;
|
|
short num9 = (short)(num3 - smooth);
|
|
short num10 = (short)(num4 - smooth);
|
|
terrain_class terrain_class5 = preterrain1;
|
|
short num11 = (short)(num3 + smooth);
|
|
short num12 = (short)(num4 - smooth);
|
|
terrain_class terrain_class6 = preterrain1;
|
|
if (num5 < 0)
|
|
{
|
|
if (!RuntimeServices.EqualityOperator(preterrain1.neighbors[3], null))
|
|
{
|
|
terrain_class3 = preterrain1.neighbors[3];
|
|
num5 = (short)(num - 1f + (float)num5);
|
|
num9 = num5;
|
|
flag = true;
|
|
}
|
|
else
|
|
{
|
|
num7 -= num5;
|
|
num11 = num7;
|
|
num5 = 0;
|
|
num9 = num5;
|
|
}
|
|
}
|
|
else if (!((float)num7 <= num - 1f))
|
|
{
|
|
if (!RuntimeServices.EqualityOperator(preterrain1.neighbors[1], null))
|
|
{
|
|
terrain_class4 = preterrain1.neighbors[1];
|
|
num7 = (short)((float)num7 - (num - 1f));
|
|
num11 = num7;
|
|
flag = true;
|
|
}
|
|
else
|
|
{
|
|
num5 = (short)((float)num5 - ((float)num7 - (num - 1f)));
|
|
num9 = num5;
|
|
num7 = (short)(num - 1f);
|
|
num11 = num7;
|
|
}
|
|
}
|
|
if (num10 < 0)
|
|
{
|
|
if (!RuntimeServices.EqualityOperator(terrain_class3.neighbors[0], null))
|
|
{
|
|
terrain_class5 = terrain_class3.neighbors[0];
|
|
num10 = (short)(num - 1f + (float)num10);
|
|
num12 = num10;
|
|
flag = true;
|
|
}
|
|
else
|
|
{
|
|
num6 -= num10;
|
|
num8 = num6;
|
|
num10 = 0;
|
|
num12 = num10;
|
|
}
|
|
}
|
|
else if (!((float)num6 <= num - 1f))
|
|
{
|
|
if (!RuntimeServices.EqualityOperator(terrain_class4.neighbors[2], null))
|
|
{
|
|
terrain_class6 = terrain_class4.neighbors[2];
|
|
num6 = (short)((float)num6 - (num - 1f));
|
|
num8 = num6;
|
|
flag = true;
|
|
}
|
|
else
|
|
{
|
|
num10 = (short)((float)num10 - ((float)num6 - (num - 1f)));
|
|
num12 = num10;
|
|
num6 = (short)(num - 1f);
|
|
num8 = num6;
|
|
}
|
|
}
|
|
float num13 = default(float);
|
|
float num14 = default(float);
|
|
float num15 = default(float);
|
|
float num16 = default(float);
|
|
if (flag)
|
|
{
|
|
num13 = terrain_class3.terrain.terrainData.GetHeight(num5, num6);
|
|
num14 = terrain_class4.terrain.terrainData.GetHeight(num7, num8);
|
|
num15 = terrain_class5.terrain.terrainData.GetHeight(num9, num10);
|
|
num16 = terrain_class6.terrain.terrainData.GetHeight(num11, num12);
|
|
}
|
|
else
|
|
{
|
|
num13 = preterrain1.terrain.terrainData.GetHeight(num5, num6);
|
|
num14 = preterrain1.terrain.terrainData.GetHeight(num7, num8);
|
|
num15 = preterrain1.terrain.terrainData.GetHeight(num9, num10);
|
|
num16 = preterrain1.terrain.terrainData.GetHeight(num11, num12);
|
|
}
|
|
float num17 = default(float);
|
|
float num18 = default(float);
|
|
if (!(num13 <= num14))
|
|
{
|
|
num18 = num13;
|
|
num17 = num14;
|
|
}
|
|
else
|
|
{
|
|
num18 = num14;
|
|
num17 = num13;
|
|
}
|
|
if (!(num15 <= num18))
|
|
{
|
|
num18 = num15;
|
|
}
|
|
if (!(num16 <= num18))
|
|
{
|
|
num18 = num16;
|
|
}
|
|
if (!(num15 >= num17))
|
|
{
|
|
num17 = num15;
|
|
}
|
|
if (!(num16 >= num17))
|
|
{
|
|
num17 = num16;
|
|
}
|
|
float num19 = Mathf.Round((num18 - num17) * (float)(101 - settings.round_angle)) / (float)(101 - settings.round_angle);
|
|
float num20 = size.x / num * ((float)smooth * 2f + 1f);
|
|
return Mathf.Atan(num19 / num20) * Rad2Deg;
|
|
}
|
|
|
|
public virtual int find_terrain_by_position(Vector3 position)
|
|
{
|
|
int num = 0;
|
|
int result;
|
|
while (true)
|
|
{
|
|
if (num < terrains.Count)
|
|
{
|
|
if (terrains[num].rect.Contains(new Vector2(position.x, position.z)))
|
|
{
|
|
result = num;
|
|
break;
|
|
}
|
|
num++;
|
|
continue;
|
|
}
|
|
result = -1;
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual int find_terrain(int tile_x, int tile_y)
|
|
{
|
|
int num = 0;
|
|
int result;
|
|
while (true)
|
|
{
|
|
if (num < terrains.Count)
|
|
{
|
|
if (terrains[num].tile_x == (float)tile_x && terrains[num].tile_z == (float)tile_y)
|
|
{
|
|
result = num;
|
|
break;
|
|
}
|
|
num++;
|
|
continue;
|
|
}
|
|
if (!generate_error)
|
|
{
|
|
Debug.Log("The order of the terrains has been changed! If you have more terrains please shift click <Fit All> in Terrain List -> Data -> Size.");
|
|
generate_error = true;
|
|
reset_terrains_tiles(script_base);
|
|
}
|
|
result = 0;
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual void calc_terrain_needed_tiles()
|
|
{
|
|
terrainInstances = new Vector2(terrainTiles.x - terrains[0].tiles.x, terrainTiles.y - terrains[0].tiles.y);
|
|
terrain_instances = (int)(terrainTiles.x * terrainTiles.y - (float)terrains.Count);
|
|
}
|
|
|
|
public virtual void calc_terrain_one_more_tile()
|
|
{
|
|
terrain_tiles = (int)(terrains[0].tiles.x + 1f);
|
|
calc_terrain_needed_tiles();
|
|
}
|
|
|
|
public virtual tile_class calc_terrain_tile(int terrain_index, tile_class tiles)
|
|
{
|
|
tile_class tile_class2 = new tile_class();
|
|
tile_class2.y = terrain_index / tiles.x;
|
|
tile_class2.x = terrain_index - tile_class2.y * tiles.x;
|
|
return tile_class2;
|
|
}
|
|
|
|
public virtual int calc_terrain_index2(tile_class tile, tile_class tiles)
|
|
{
|
|
return tile.x + tile.y * tiles.x;
|
|
}
|
|
|
|
public virtual int find_terrain_by_name(Terrain terrain)
|
|
{
|
|
string text = terrain.name;
|
|
int num = 0;
|
|
int result;
|
|
while (true)
|
|
{
|
|
if (num < terrains.Count)
|
|
{
|
|
if ((bool)terrains[num].terrain && terrains[num].terrain.name == text)
|
|
{
|
|
result = num;
|
|
break;
|
|
}
|
|
num++;
|
|
continue;
|
|
}
|
|
result = -1;
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual void reset_terrains_tiles(terraincomposer_save script_save)
|
|
{
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
script_save.terrains[i].tiles = new Vector2(1f, 1f);
|
|
script_save.terrains[i].tile_x = 0f;
|
|
script_save.terrains[i].tile_z = 0f;
|
|
}
|
|
}
|
|
|
|
public virtual string sec_to_timeMin(float seconds, bool display_seconds)
|
|
{
|
|
int num = (int)(seconds / 60f);
|
|
seconds -= (float)(num * 60);
|
|
object result;
|
|
if (num == 0)
|
|
{
|
|
result = seconds.ToString("F2");
|
|
}
|
|
else
|
|
{
|
|
int num2 = (int)seconds;
|
|
seconds -= (float)num2;
|
|
int num3 = (int)(seconds * 100f);
|
|
result = ((!display_seconds) ? (num.ToString() + ":" + num2.ToString("D2")) : (num.ToString() + ":" + num2.ToString("D2") + "." + num3.ToString("D2")));
|
|
}
|
|
return (string)result;
|
|
}
|
|
|
|
public virtual void get_rtp_lodmanager()
|
|
{
|
|
RTP_LODmanager1 = GameObject.Find("_RTP_LODmanager");
|
|
if ((bool)RTP_LODmanager1)
|
|
{
|
|
rtpLod_script = RTP_LODmanager1.GetComponent("RTP_LODmanager");
|
|
}
|
|
}
|
|
|
|
public virtual int generate_object(prelayer_class prelayer3)
|
|
{
|
|
frames = 1f / (Time.realtimeSinceStartup - auto_speed_time);
|
|
auto_speed_time = Time.realtimeSinceStartup;
|
|
break_x = false;
|
|
row_object_count = 0;
|
|
prelayer3.counter_y = prelayer3.y;
|
|
int result;
|
|
while (true)
|
|
{
|
|
object_class object_class2;
|
|
Quaternion quaternion;
|
|
if (prelayer3.counter_y >= prelayer3.y - (float)generate_speed * prelayer.prearea.step.y)
|
|
{
|
|
generate_call_time = Time.realtimeSinceStartup;
|
|
float y = prelayer3.y;
|
|
int num = default(int);
|
|
if (!(prelayer3.counter_y >= prelayer3.prearea.area.yMin))
|
|
{
|
|
if (prelayer_stack.Count > 1)
|
|
{
|
|
prelayer_stack.RemoveAt(prelayer_stack.Count - 1);
|
|
prelayer = prelayers[prelayer_stack[prelayer_stack.Count - 1]];
|
|
generate_error = false;
|
|
result = 2;
|
|
break;
|
|
}
|
|
if (generate_world_mode)
|
|
{
|
|
generate = false;
|
|
for (num = 0; num < terrains.Count; num++)
|
|
{
|
|
terrain_apply(terrains[num]);
|
|
}
|
|
}
|
|
generate_time = Time.realtimeSinceStartup - generate_time_start;
|
|
if (generate)
|
|
{
|
|
prelayer3.count_terrain++;
|
|
if (find_terrain(false))
|
|
{
|
|
preterrain = terrains[prelayer3.count_terrain];
|
|
generate_terrain_start();
|
|
}
|
|
else
|
|
{
|
|
generate = false;
|
|
generateDone = true;
|
|
}
|
|
}
|
|
generate_error = false;
|
|
result = 2;
|
|
break;
|
|
}
|
|
if (generate_world_mode || prelayer3.index > 0)
|
|
{
|
|
for (num = 0; num < terrains.Count; num++)
|
|
{
|
|
if (terrains[num].rect.Contains(new Vector2(terrains[num].prearea.area.x, y)))
|
|
{
|
|
terrains[num].on_row = true;
|
|
}
|
|
else
|
|
{
|
|
terrains[num].on_row = false;
|
|
}
|
|
}
|
|
}
|
|
prelayer3.x = prelayer3.prearea.area.x + prelayer3.break_x_value;
|
|
for (; prelayer3.x <= prelayer3.prearea.area.xMax; prelayer3.x += prelayer3.prearea.step.x)
|
|
{
|
|
float x = prelayer3.x;
|
|
float num2 = default(float);
|
|
float num3 = default(float);
|
|
float num4 = default(float);
|
|
float num5 = prelayer3.counter_y;
|
|
if (generate_world_mode || prelayer3.index > 0)
|
|
{
|
|
bool flag = true;
|
|
for (num = 0; num < terrains.Count; num++)
|
|
{
|
|
if (terrains[num].rect.Contains(new Vector2(x, num5)))
|
|
{
|
|
flag = false;
|
|
preterrain = terrains[num];
|
|
break;
|
|
}
|
|
}
|
|
if (flag)
|
|
{
|
|
continue;
|
|
}
|
|
if (prelayer3.prearea.rotation_active)
|
|
{
|
|
Vector2 vector = calc_rotation_pixel(x, num5, prelayer3.prearea.center.x, prelayer3.prearea.center.y, prelayer3.prearea.rotation.y);
|
|
x = vector.x;
|
|
num5 = vector.y;
|
|
}
|
|
}
|
|
local_x = x - preterrain.rect.x;
|
|
local_y = num5 - preterrain.rect.y;
|
|
local_x_rot = x - preterrain.rect.x;
|
|
local_y_rot = num5 - preterrain.rect.y;
|
|
if (settings.showTerrains)
|
|
{
|
|
degree = calc_terrain_angle(preterrain, local_x_rot, local_y_rot, settings.smooth_angle) * settings.global_degree_strength + settings.global_degree_level;
|
|
height = preterrain.terrain.terrainData.GetHeight((int)(local_x_rot / preterrain.heightmap_conversion.x), (int)(local_y_rot / preterrain.heightmap_conversion.y)) / preterrain.size.y * settings.global_height_strength + settings.global_height_level;
|
|
}
|
|
random_range = UnityEngine.Random.Range(0f, 1000f);
|
|
int i;
|
|
for (i = 0; i < prelayer3.layer.Count; i++)
|
|
{
|
|
current_layer = prelayer3.layer[i];
|
|
filter_value = 0f;
|
|
filter_strength = 1f;
|
|
layer_x = local_x_rot;
|
|
layer_y = local_y_rot;
|
|
}
|
|
for (int j = 0; j < current_layer.prefilter.filter_index.Count; j++)
|
|
{
|
|
calc_filter_value(filter[current_layer.prefilter.filter_index[j]], num5, x);
|
|
}
|
|
if (subfilter_value * current_layer.strength * filter_strength <= 0f)
|
|
{
|
|
continue;
|
|
}
|
|
int index = (int)(current_layer.object_output.object_value.curve.Evaluate(filter_value) * (float)current_layer.object_output.@object.Count);
|
|
object_class2 = current_layer.object_output.@object[index];
|
|
if (current_layer.positionSeed)
|
|
{
|
|
if (num5 == 0f || x == 0f)
|
|
{
|
|
UnityEngine.Random.seed = (int)((float)(seed - 10) + (num5 + 1f) * (x + 1f) + (float)(10000000 * (i + 1)));
|
|
}
|
|
else
|
|
{
|
|
UnityEngine.Random.seed = (int)((float)(seed - 10) + num5 * x * (float)(i + 1));
|
|
}
|
|
}
|
|
random_range2 = UnityEngine.Random.Range(0f, 1f);
|
|
if (!(random_range2 <= subfilter_value * current_layer.strength * filter_strength))
|
|
{
|
|
continue;
|
|
}
|
|
place = true;
|
|
bool flag2 = true;
|
|
quaternion = Quaternion.identity;
|
|
int num6 = default(int);
|
|
position = new Vector3(x, 0f, num5);
|
|
Vector3 position_start = object_class2.position_start;
|
|
Vector3 position_end = object_class2.position_end;
|
|
Vector3 vector2 = new Vector3
|
|
{
|
|
x = UnityEngine.Random.Range(position_start.x, position_end.x),
|
|
y = UnityEngine.Random.Range(position_start.y, position_end.y),
|
|
z = UnityEngine.Random.Range(position_start.z, position_end.z)
|
|
};
|
|
if (object_class2.random_position)
|
|
{
|
|
vector2.x += UnityEngine.Random.Range(0f - prelayer3.prearea.step.x, prelayer3.prearea.step.x);
|
|
vector2.z += UnityEngine.Random.Range(0f - prelayer3.prearea.step.y, prelayer3.prearea.step.y);
|
|
}
|
|
position += vector2;
|
|
if (object_class2.terrain_rotate)
|
|
{
|
|
Vector3 interpolatedNormal = preterrain.terrain.terrainData.GetInterpolatedNormal((local_x_rot + vector2.x) / preterrain.size.x, (local_y_rot + vector2.y) / preterrain.size.z);
|
|
interpolatedNormal.x = interpolatedNormal.x / 3f * 2f;
|
|
interpolatedNormal.z = interpolatedNormal.z / 3f * 2f;
|
|
quaternion = Quaternion.FromToRotation(Vector3.up, interpolatedNormal);
|
|
}
|
|
quaternion *= Quaternion.AngleAxis(UnityEngine.Random.Range(object_class2.rotation_start.x, object_class2.rotation_end.x), Vector3.right);
|
|
quaternion *= Quaternion.AngleAxis(UnityEngine.Random.Range(object_class2.rotation_start.y, object_class2.rotation_end.y), Vector3.up);
|
|
quaternion *= Quaternion.AngleAxis(UnityEngine.Random.Range(object_class2.rotation_start.z, object_class2.rotation_end.z), Vector3.forward);
|
|
quaternion *= Quaternion.Euler(object_class2.parent_rotation);
|
|
if (object_class2.terrain_height)
|
|
{
|
|
height_interpolated = preterrain.terrain.terrainData.GetInterpolatedHeight((local_x_rot + vector2.x) / preterrain.size.x, (local_y_rot + vector2.z) / preterrain.size.z);
|
|
position.y = height_interpolated + preterrain.terrain.transform.position.y + vector2.y;
|
|
}
|
|
float num7 = object_class2.scale_end.x - object_class2.scale_start.x;
|
|
scale.x = UnityEngine.Random.Range(object_class2.scale_start.x, object_class2.scale_end.x);
|
|
float num8 = scale.x - object_class2.scale_start.x;
|
|
float num9 = num8 / num7;
|
|
float num10 = object_class2.scale_end.y - object_class2.scale_start.y;
|
|
float num11 = num10 * num9 - object_class2.unlink_y * num8 + object_class2.scale_start.y;
|
|
if (!(num11 >= object_class2.scale_start.y))
|
|
{
|
|
num11 = object_class2.scale_start.y;
|
|
}
|
|
float num12 = num10 * num9 + object_class2.unlink_y * num8 + object_class2.scale_start.y;
|
|
if (!(num12 <= object_class2.scale_end.y))
|
|
{
|
|
num12 = object_class2.scale_end.y;
|
|
}
|
|
scale.y = UnityEngine.Random.Range(num11, num12);
|
|
float num13 = object_class2.scale_end.z - object_class2.scale_start.z;
|
|
float num14 = num13 * num9 - object_class2.unlink_z * num8 + object_class2.scale_start.z;
|
|
if (!(num14 >= object_class2.scale_start.z))
|
|
{
|
|
num14 = object_class2.scale_start.z;
|
|
}
|
|
float num15 = num13 * num9 + object_class2.unlink_z * num8 + object_class2.scale_start.z;
|
|
if (!(num15 <= object_class2.scale_end.z))
|
|
{
|
|
num15 = object_class2.scale_end.z;
|
|
}
|
|
scale.z = UnityEngine.Random.Range(num14, num15);
|
|
if (object_class2.raycast && Physics.SphereCast(position + new Vector3(0f, object_class2.cast_height, 0f), object_class2.ray_radius, object_class2.ray_direction, out hit, object_class2.ray_length))
|
|
{
|
|
layerHit = (int)Mathf.Pow(2f, hit.transform.gameObject.layer);
|
|
if ((layerHit & object_class2.layerMask) != 0)
|
|
{
|
|
position.y = hit.point.y;
|
|
}
|
|
}
|
|
if (object_class2.pivot_center)
|
|
{
|
|
position.y += scale.y / 2f;
|
|
}
|
|
bool flag3 = false;
|
|
scale *= current_layer.object_output.scale;
|
|
if (!place)
|
|
{
|
|
continue;
|
|
}
|
|
float z = preterrain.size.z;
|
|
z /= preterrain.heightmap_resolution;
|
|
object_class2.placed++;
|
|
object_class2.placed_prelayer++;
|
|
current_layer.object_output.placed = current_layer.object_output.placed + 1;
|
|
row_object_count++;
|
|
if (!object_class2.prelayer_created || !prelayers[object_class2.prelayer_index].prearea.active)
|
|
{
|
|
continue;
|
|
}
|
|
goto IL_0c9d;
|
|
}
|
|
prelayer3.counter_y -= prelayer.prearea.step.y;
|
|
continue;
|
|
}
|
|
prelayer3.y -= (float)(generate_speed + 1) * prelayer.prearea.step.y;
|
|
generate_time = Time.realtimeSinceStartup - generate_time_start;
|
|
result = 1;
|
|
break;
|
|
IL_0c9d:
|
|
set_object_child(object_class2, quaternion.eulerAngles);
|
|
prelayer3.x += prelayer3.prearea.step.x;
|
|
prelayer3.y = prelayer3.counter_y;
|
|
if (!(prelayer3.x > prelayer.prearea.area.xMax))
|
|
{
|
|
prelayer3.break_x_value = prelayer3.x - prelayer3.prearea.area.x;
|
|
}
|
|
else
|
|
{
|
|
prelayer3.y -= prelayer3.prearea.step.y;
|
|
prelayer3.break_x_value = 0f;
|
|
}
|
|
prelayer_stack.Add(object_class2.prelayer_index);
|
|
prelayer = prelayers[object_class2.prelayer_index];
|
|
prelayer.prearea.area.x = position.x + prelayer.prearea.area_old.x * scale.x;
|
|
prelayer.prearea.area.y = position.z + prelayer.prearea.area_old.y * scale.z;
|
|
prelayer.prearea.area.width = prelayer.prearea.area_old.width * scale.x;
|
|
prelayer.prearea.area.height = prelayer.prearea.area_old.height * scale.z;
|
|
if (quaternion.y != 0f)
|
|
{
|
|
prelayer.prearea.rotation = quaternion.eulerAngles;
|
|
prelayer.prearea.rotation_active = true;
|
|
}
|
|
prelayer.prearea.step.y = Mathf.Sqrt(Mathf.Pow(prelayer.prearea.step_old.x, 2f) + Mathf.Pow(prelayer.prearea.step_old.y, 2f)) / 2f;
|
|
prelayer.prearea.step.x = prelayer.prearea.step.y;
|
|
prelayer.prearea.center = new Vector2(position.x, position.z);
|
|
prelayer.y = prelayer.prearea.area.yMax;
|
|
result = 3;
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
public virtual string convert_terrains_to_mesh()
|
|
{
|
|
GameObject gameObject = null;
|
|
GameObject gameObject2 = null;
|
|
List<vertex_class> list = new List<vertex_class>();
|
|
int num = default(int);
|
|
int num2 = default(int);
|
|
int num3 = default(int);
|
|
List<Mesh> list2 = new List<Mesh>();
|
|
int num4 = default(int);
|
|
int num5 = default(int);
|
|
terrain_class terrain_class3 = terrains[0];
|
|
normal_class normal_class2 = null;
|
|
Vector3 vector = default(Vector3);
|
|
float realtimeSinceStartup = Time.realtimeSinceStartup;
|
|
int num6 = 0;
|
|
num3 = 0;
|
|
object result;
|
|
while (true)
|
|
{
|
|
if (num3 < terrains.Count)
|
|
{
|
|
if (!terrains[num3].terrain)
|
|
{
|
|
result = "All terrains must be assigned";
|
|
break;
|
|
}
|
|
if (!terrains[num3].terrain.terrainData)
|
|
{
|
|
result = "All terrainData's must be assigned";
|
|
break;
|
|
}
|
|
if (terrains[num3].terrain.terrainData.heightmapResolution > 129)
|
|
{
|
|
result = "Can only convert 33, 65 and 129 heightmap resolution at the moment";
|
|
break;
|
|
}
|
|
if (terrains[num3].active)
|
|
{
|
|
num6++;
|
|
}
|
|
num3++;
|
|
continue;
|
|
}
|
|
if (num6 == 0)
|
|
{
|
|
result = "Please activate at least 1 terrain";
|
|
break;
|
|
}
|
|
num6 = 0;
|
|
gameObject = new GameObject();
|
|
gameObject.name = "Terrains Mesh";
|
|
for (num3 = 0; num3 < terrains.Count; num3++)
|
|
{
|
|
if (terrains[num3].active)
|
|
{
|
|
num2 = terrains[num3].terrain.terrainData.heightmapResolution;
|
|
vector.x = terrain_class3.terrain.terrainData.size.x / (float)(num2 - 1);
|
|
vector.z = terrain_class3.terrain.terrainData.size.z / (float)(num2 - 1);
|
|
vector.y = terrain_class3.terrain.terrainData.size.y;
|
|
terrains[num3].index = num3;
|
|
list2.Add(convert_terrain_to_mesh(terrains[num3], gameObject));
|
|
list.Add(new vertex_class());
|
|
list[num6].vertices = list2[num6].vertices;
|
|
num6++;
|
|
}
|
|
}
|
|
Mesh mesh = null;
|
|
result = "Converting " + 0.ToString() + " terrains to meshes done";
|
|
break;
|
|
}
|
|
return (string)result;
|
|
}
|
|
|
|
public virtual Mesh convert_terrain_to_mesh(terrain_class preterrain1, GameObject parent)
|
|
{
|
|
float realtimeSinceStartup = Time.realtimeSinceStartup;
|
|
object result;
|
|
if ((bool)preterrain1.terrain && (bool)preterrain1.terrain.terrainData)
|
|
{
|
|
int heightmapResolution = preterrain1.terrain.terrainData.heightmapResolution;
|
|
int num = heightmapResolution * heightmapResolution;
|
|
Vector3[] array = new Vector3[num];
|
|
int num2 = 0;
|
|
Vector2[] array2 = new Vector2[array.Length];
|
|
float num3 = preterrain1.terrain.terrainData.size.x / (float)(heightmapResolution - 1);
|
|
float num4 = preterrain1.terrain.terrainData.size.z / (float)(heightmapResolution - 1);
|
|
float y = preterrain1.terrain.terrainData.size.y;
|
|
int num5 = default(int);
|
|
int num6 = default(int);
|
|
float y2 = preterrain1.terrain.terrainData.size.y;
|
|
Vector3 vector = preterrain1.terrain.transform.position;
|
|
for (num5 = 0; num5 < heightmapResolution; num5++)
|
|
{
|
|
for (num6 = 0; num6 < heightmapResolution; num6++)
|
|
{
|
|
array[num2] = new Vector3((float)num6 * num3, preterrain1.terrain.terrainData.GetHeight(num6, num5), (float)num5 * num4);
|
|
array2[num2++] = new Vector2((float)num6 * 1f / (float)heightmapResolution, (float)num5 * 1f / (float)heightmapResolution);
|
|
}
|
|
}
|
|
int[] array3 = new int[array.Length * 6];
|
|
int num7 = 0;
|
|
int num8 = default(int);
|
|
int num9 = default(int);
|
|
for (num5 = 0; num5 < heightmapResolution - 1; num5++)
|
|
{
|
|
for (num6 = 0; num6 < heightmapResolution - 1; num6++)
|
|
{
|
|
num8 = num5 * heightmapResolution + num6;
|
|
array3[num7++] = num8 + 1;
|
|
array3[num7++] = num8;
|
|
array3[num7++] = num8 + heightmapResolution;
|
|
array3[num7++] = num8 + 1;
|
|
array3[num7++] = num8 + heightmapResolution;
|
|
array3[num7++] = num8 + heightmapResolution + 1;
|
|
}
|
|
}
|
|
GameObject gameObject = new GameObject();
|
|
gameObject.transform.position = preterrain1.terrain.transform.position;
|
|
gameObject.transform.parent = parent.transform;
|
|
gameObject.name = preterrain1.name;
|
|
Mesh mesh = new Mesh();
|
|
MeshFilter meshFilter = (MeshFilter)gameObject.AddComponent(typeof(MeshFilter));
|
|
MeshRenderer meshRenderer = (MeshRenderer)gameObject.AddComponent(typeof(MeshRenderer));
|
|
meshRenderer.material = settings.mesh_material;
|
|
meshFilter.mesh = mesh;
|
|
mesh.vertices = array;
|
|
mesh.triangles = array3;
|
|
mesh.uv = array2;
|
|
float num10 = Time.realtimeSinceStartup - realtimeSinceStartup;
|
|
float num11 = Time.realtimeSinceStartup - realtimeSinceStartup;
|
|
result = mesh;
|
|
}
|
|
else
|
|
{
|
|
result = null;
|
|
}
|
|
return (Mesh)result;
|
|
}
|
|
|
|
public virtual normal_class calc_normal(float space, vertex_class vertex, int pos, int resolution)
|
|
{
|
|
normal_class normal_class2 = new normal_class();
|
|
Vector3 vector = default(Vector3);
|
|
Vector3 vector2 = default(Vector3);
|
|
Vector3 vector3 = default(Vector3);
|
|
Vector3 vector4 = default(Vector3);
|
|
Vector3 vector5 = default(Vector3);
|
|
Vector3 vector6 = default(Vector3);
|
|
Vector3 vector7 = default(Vector3);
|
|
Vector3 vector8 = default(Vector3);
|
|
Vector3 vector9 = default(Vector3);
|
|
Vector3 vector10 = default(Vector3);
|
|
Vector4 vector11 = default(Vector4);
|
|
float num = default(float);
|
|
float num2 = default(float);
|
|
vector = vertex.vertices[pos];
|
|
vector2 = vertex.vertices[pos - resolution - 1];
|
|
vector3 = vertex.vertices[pos - resolution];
|
|
vector4 = vertex.vertices[pos - resolution + 1];
|
|
vector5 = vertex.vertices[pos - 1];
|
|
vector6 = vertex.vertices[pos + 1];
|
|
vector7 = vertex.vertices[pos + resolution - 1];
|
|
vector8 = vertex.vertices[pos + resolution];
|
|
vector9 = vertex.vertices[pos + resolution + 1];
|
|
vector10 = Vector3.Cross(vector2 - vector, vector3 - vector);
|
|
vector10 += Vector3.Cross(vector3 - vector, vector4 - vector);
|
|
vector10 += Vector3.Cross(vector5 - vector, vector2 - vector);
|
|
vector10 += Vector3.Cross(vector4 - vector, vector6 - vector);
|
|
vector10 += Vector3.Cross(vector7 - vector, vector5 - vector);
|
|
vector10 += Vector3.Cross(vector6 - vector, vector9 - vector);
|
|
vector10 += Vector3.Cross(vector8 - vector, vector7 - vector);
|
|
vector10 += Vector3.Cross(vector9 - vector, vector8 - vector);
|
|
vector10 = (vector10 / 8f).normalized;
|
|
vector10.y *= -1f;
|
|
normal_class2.normal = vector10;
|
|
num = vector5.y;
|
|
num2 = vector6.y;
|
|
normal_class2.tangent = new Vector4(0f - space, num2 - num, 0f, 0f - space).normalized;
|
|
return normal_class2;
|
|
}
|
|
|
|
public virtual normal_class calc_normal_border_left(terrain_class preterrain1, float space, List<vertex_class> vertex, int y, int resolution, Vector3 size)
|
|
{
|
|
normal_class normal_class2 = new normal_class();
|
|
Vector3 vector = default(Vector3);
|
|
Vector3 vector2 = default(Vector3);
|
|
Vector3 vector3 = default(Vector3);
|
|
Vector3 vector4 = default(Vector3);
|
|
Vector3 vector5 = default(Vector3);
|
|
Vector3 vector6 = default(Vector3);
|
|
Vector3 vector7 = default(Vector3);
|
|
Vector3 vector8 = default(Vector3);
|
|
Vector3 vector9 = default(Vector3);
|
|
bool flag = true;
|
|
bool flag2 = true;
|
|
bool flag3 = true;
|
|
bool flag4 = true;
|
|
bool flag5 = true;
|
|
bool flag6 = true;
|
|
bool flag7 = true;
|
|
Vector3 vector10 = Vector3.zero;
|
|
Vector4 vector11 = default(Vector4);
|
|
float num = default(float);
|
|
float num2 = default(float);
|
|
float num3 = 0f;
|
|
vector = vertex[preterrain1.index].vertices[y * resolution];
|
|
if (preterrain1.neighbor.left > -1)
|
|
{
|
|
vector2 = vertex[preterrain1.neighbor.left].vertices[resolution - 2 + (y - 1) * resolution] - new Vector3(size.x, 0f, 0f);
|
|
vector5 = vertex[preterrain1.neighbor.left].vertices[resolution - 2 + y * resolution] - new Vector3(size.x, 0f, 0f);
|
|
vector7 = vertex[preterrain1.neighbor.left].vertices[resolution - 2 + (y + 1) * resolution] - new Vector3(size.x, 0f, 0f);
|
|
}
|
|
else
|
|
{
|
|
flag = false;
|
|
flag4 = false;
|
|
flag5 = false;
|
|
}
|
|
vector3 = vertex[preterrain1.index].vertices[(y - 1) * resolution];
|
|
vector4 = vertex[preterrain1.index].vertices[1 + (y - 1) * resolution];
|
|
vector8 = vertex[preterrain1.index].vertices[(y + 1) * resolution];
|
|
vector9 = vertex[preterrain1.index].vertices[1 + (y + 1) * resolution];
|
|
vector6 = vertex[preterrain1.index].vertices[1 + y * resolution];
|
|
if (flag && flag2)
|
|
{
|
|
vector10 = Vector3.Cross(vector2 - vector, vector3 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag2 && flag3)
|
|
{
|
|
vector10 += Vector3.Cross(vector3 - vector, vector4 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag4 && flag)
|
|
{
|
|
vector10 += Vector3.Cross(vector5 - vector, vector2 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag3)
|
|
{
|
|
vector10 += Vector3.Cross(vector4 - vector, vector6 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag5 && flag4)
|
|
{
|
|
vector10 += Vector3.Cross(vector7 - vector, vector5 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag7)
|
|
{
|
|
vector10 += Vector3.Cross(vector6 - vector, vector9 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag5 && flag6)
|
|
{
|
|
vector10 += Vector3.Cross(vector8 - vector, vector7 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag6 && flag7)
|
|
{
|
|
vector10 += Vector3.Cross(vector9 - vector, vector8 - vector);
|
|
num3 += 1f;
|
|
}
|
|
vector10 = (vector10 / num3).normalized;
|
|
vector10.y *= -1f;
|
|
normal_class2.normal = vector10;
|
|
num = ((!flag4) ? vector.y : vector5.y);
|
|
num2 = vector6.y;
|
|
normal_class2.tangent = new Vector4(0f - space, num2 - num, 0f, 0f - space).normalized;
|
|
return normal_class2;
|
|
}
|
|
|
|
public virtual normal_class calc_normal_border_right(terrain_class preterrain1, float space, List<vertex_class> vertex, int y, int resolution, Vector3 size)
|
|
{
|
|
normal_class normal_class2 = new normal_class();
|
|
Vector3 vector = default(Vector3);
|
|
Vector3 vector2 = default(Vector3);
|
|
Vector3 vector3 = default(Vector3);
|
|
Vector3 vector4 = default(Vector3);
|
|
Vector3 vector5 = default(Vector3);
|
|
Vector3 vector6 = default(Vector3);
|
|
Vector3 vector7 = default(Vector3);
|
|
Vector3 vector8 = default(Vector3);
|
|
Vector3 vector9 = default(Vector3);
|
|
bool flag = true;
|
|
bool flag2 = true;
|
|
bool flag3 = true;
|
|
bool flag4 = true;
|
|
bool flag5 = true;
|
|
bool flag6 = true;
|
|
bool flag7 = true;
|
|
Vector3 vector10 = Vector3.zero;
|
|
Vector4 vector11 = default(Vector4);
|
|
float num = default(float);
|
|
float num2 = default(float);
|
|
float num3 = 0f;
|
|
if (preterrain1.neighbor.right > -1)
|
|
{
|
|
vector4 = vertex[preterrain1.neighbor.right].vertices[1 + (y - 1) * resolution] + new Vector3(size.x, 0f, 0f);
|
|
vector6 = vertex[preterrain1.neighbor.right].vertices[1 + y * resolution] + new Vector3(size.x, 0f, 0f);
|
|
vector9 = vertex[preterrain1.neighbor.right].vertices[1 + (y + 1) * resolution] + new Vector3(size.x, 0f, 0f);
|
|
}
|
|
else
|
|
{
|
|
flag3 = false;
|
|
flag4 = false;
|
|
flag7 = false;
|
|
}
|
|
vector2 = vertex[preterrain1.index].vertices[resolution - 2 + (y - 1) * resolution];
|
|
vector3 = vertex[preterrain1.index].vertices[resolution - 1 + (y - 1) * resolution];
|
|
vector7 = vertex[preterrain1.index].vertices[resolution - 2 + (y + 1) * resolution];
|
|
vector8 = vertex[preterrain1.index].vertices[resolution - 1 + (y + 1) * resolution];
|
|
vector = vertex[preterrain1.index].vertices[resolution - 1 + y * resolution];
|
|
vector5 = vertex[preterrain1.index].vertices[resolution - 2 + y * resolution];
|
|
if (flag && flag2)
|
|
{
|
|
vector10 = Vector3.Cross(vector2 - vector, vector3 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag2 && flag3)
|
|
{
|
|
vector10 += Vector3.Cross(vector3 - vector, vector4 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag)
|
|
{
|
|
vector10 += Vector3.Cross(vector5 - vector, vector2 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag3 && flag4)
|
|
{
|
|
vector10 += Vector3.Cross(vector4 - vector, vector6 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag5)
|
|
{
|
|
vector10 += Vector3.Cross(vector7 - vector, vector5 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag4 && flag7)
|
|
{
|
|
vector10 += Vector3.Cross(vector6 - vector, vector9 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag5 && flag6)
|
|
{
|
|
vector10 += Vector3.Cross(vector8 - vector, vector7 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag7 && flag6)
|
|
{
|
|
vector10 += Vector3.Cross(vector9 - vector, vector8 - vector);
|
|
num3 += 1f;
|
|
}
|
|
vector10 = (vector10 / num3).normalized;
|
|
vector10.y *= -1f;
|
|
normal_class2.normal = vector10;
|
|
num = vector5.y;
|
|
num2 = ((!flag4) ? vector.y : vector6.y);
|
|
normal_class2.tangent = new Vector4(0f - space, num2 - num, 0f, 0f - space).normalized;
|
|
return normal_class2;
|
|
}
|
|
|
|
public virtual normal_class calc_normal_border_top(terrain_class preterrain1, float space, List<vertex_class> vertex, int x, int resolution, Vector3 size)
|
|
{
|
|
normal_class normal_class2 = new normal_class();
|
|
Vector3 vector = default(Vector3);
|
|
Vector3 vector2 = default(Vector3);
|
|
Vector3 vector3 = default(Vector3);
|
|
Vector3 vector4 = default(Vector3);
|
|
Vector3 vector5 = default(Vector3);
|
|
Vector3 vector6 = default(Vector3);
|
|
Vector3 vector7 = default(Vector3);
|
|
Vector3 vector8 = default(Vector3);
|
|
Vector3 vector9 = default(Vector3);
|
|
bool flag = true;
|
|
bool flag2 = true;
|
|
bool flag3 = true;
|
|
bool flag4 = true;
|
|
bool flag5 = true;
|
|
bool flag6 = true;
|
|
bool flag7 = true;
|
|
Vector3 vector10 = Vector3.zero;
|
|
Vector4 vector11 = default(Vector4);
|
|
float num = default(float);
|
|
float num2 = default(float);
|
|
float num3 = 0f;
|
|
if (x + 1 > resolution - 1)
|
|
{
|
|
if (preterrain1.neighbor.right > -1)
|
|
{
|
|
vector6 = vertex[preterrain1.neighbor.right].vertices[1 + resolution * (resolution - 1)] + new Vector3(size.x, 0f, 0f);
|
|
vector4 = vertex[preterrain1.neighbor.right].vertices[1 + resolution * (resolution - 2)] + new Vector3(size.x, 0f, 0f);
|
|
if (preterrain1.neighbor.top_right > -1)
|
|
{
|
|
vector9 = vertex[preterrain1.neighbor.top_right].vertices[resolution + 1] + new Vector3(size.x, 0f, size.z);
|
|
}
|
|
else
|
|
{
|
|
flag7 = false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
flag2 = false;
|
|
flag4 = false;
|
|
flag7 = false;
|
|
}
|
|
if (preterrain1.neighbor.top > -1)
|
|
{
|
|
vector7 = vertex[preterrain1.neighbor.top].vertices[x - 1 + resolution] + new Vector3(0f, 0f, size.z);
|
|
vector8 = vertex[preterrain1.neighbor.top].vertices[x + resolution] + new Vector3(0f, 0f, size.z);
|
|
}
|
|
else
|
|
{
|
|
flag5 = false;
|
|
flag6 = false;
|
|
}
|
|
vector2 = vertex[preterrain1.index].vertices[x - 1 + resolution * (resolution - 2)];
|
|
vector5 = vertex[preterrain1.index].vertices[x - 1 + resolution * (resolution - 1)];
|
|
}
|
|
else if (x - 1 < 0)
|
|
{
|
|
if (preterrain1.neighbor.left > -1)
|
|
{
|
|
vector2 = vertex[preterrain1.neighbor.left].vertices[resolution - 2 + resolution * (resolution - 2)] - new Vector3(size.x, 0f, 0f);
|
|
vector5 = vertex[preterrain1.neighbor.left].vertices[resolution - 2 + resolution * (resolution - 1)] - new Vector3(size.x, 0f, 0f);
|
|
if (preterrain1.neighbor.top_left > -1)
|
|
{
|
|
vector7 = vertex[preterrain1.neighbor.top_left].vertices[resolution - 2 + resolution] - new Vector3(size.x, 0f, 0f - size.z);
|
|
}
|
|
else
|
|
{
|
|
flag5 = false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
flag = false;
|
|
flag3 = false;
|
|
flag5 = false;
|
|
}
|
|
if (preterrain1.neighbor.top > -1)
|
|
{
|
|
vector8 = vertex[preterrain1.neighbor.top].vertices[x + resolution] + new Vector3(0f, 0f, size.z);
|
|
vector9 = vertex[preterrain1.neighbor.top].vertices[x + 1 + resolution] + new Vector3(0f, 0f, size.z);
|
|
}
|
|
else
|
|
{
|
|
flag6 = false;
|
|
flag7 = false;
|
|
}
|
|
vector4 = vertex[preterrain1.index].vertices[x + 1 + resolution * (resolution - 2)];
|
|
vector6 = vertex[preterrain1.index].vertices[x + 1 + resolution * (resolution - 1)];
|
|
}
|
|
else
|
|
{
|
|
if (preterrain1.neighbor.top > -1)
|
|
{
|
|
vector7 = vertex[preterrain1.neighbor.top].vertices[x - 1 + resolution] + new Vector3(0f, 0f, size.z);
|
|
vector8 = vertex[preterrain1.neighbor.top].vertices[x + resolution] + new Vector3(0f, 0f, size.z);
|
|
vector9 = vertex[preterrain1.neighbor.top].vertices[x + 1 + resolution] + new Vector3(0f, 0f, size.z);
|
|
}
|
|
else
|
|
{
|
|
flag5 = false;
|
|
flag6 = false;
|
|
flag7 = false;
|
|
}
|
|
vector2 = vertex[preterrain1.index].vertices[x - 1 + resolution * (resolution - 2)];
|
|
vector4 = vertex[preterrain1.index].vertices[x + 1 + resolution * (resolution - 2)];
|
|
vector5 = vertex[preterrain1.index].vertices[x - 1 + resolution * (resolution - 1)];
|
|
vector6 = vertex[preterrain1.index].vertices[x + 1 + resolution * (resolution - 1)];
|
|
}
|
|
vector = vertex[preterrain1.index].vertices[x + resolution * (resolution - 1)];
|
|
vector3 = vertex[preterrain1.index].vertices[x + resolution * (resolution - 2)];
|
|
if (flag)
|
|
{
|
|
vector10 = Vector3.Cross(vector2 - vector, vector3 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag2)
|
|
{
|
|
vector10 += Vector3.Cross(vector3 - vector, vector4 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag && flag3)
|
|
{
|
|
vector10 += Vector3.Cross(vector5 - vector, vector2 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag2 && flag4)
|
|
{
|
|
vector10 += Vector3.Cross(vector4 - vector, vector6 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag5 && flag3)
|
|
{
|
|
vector10 += Vector3.Cross(vector7 - vector, vector5 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag4 && flag7)
|
|
{
|
|
vector10 += Vector3.Cross(vector6 - vector, vector9 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag5 && flag6)
|
|
{
|
|
vector10 += Vector3.Cross(vector8 - vector, vector7 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag7 && flag6)
|
|
{
|
|
vector10 += Vector3.Cross(vector9 - vector, vector8 - vector);
|
|
num3 += 1f;
|
|
}
|
|
vector10 = (vector10 / num3).normalized;
|
|
vector10.y *= -1f;
|
|
normal_class2.normal = vector10;
|
|
num = ((!flag3) ? vector.y : vector5.y);
|
|
num2 = ((!flag4) ? vector.y : vector6.y);
|
|
normal_class2.tangent = new Vector4(0f - space, num2 - num, 0f, 0f - space).normalized;
|
|
return normal_class2;
|
|
}
|
|
|
|
public virtual normal_class calc_normal_border_bottom(terrain_class preterrain1, float space, List<vertex_class> vertex, int x, int resolution, Vector3 size)
|
|
{
|
|
normal_class normal_class2 = new normal_class();
|
|
Vector3 vector = default(Vector3);
|
|
Vector3 vector2 = default(Vector3);
|
|
Vector3 vector3 = default(Vector3);
|
|
Vector3 vector4 = default(Vector3);
|
|
Vector3 vector5 = default(Vector3);
|
|
Vector3 vector6 = default(Vector3);
|
|
Vector3 vector7 = default(Vector3);
|
|
Vector3 vector8 = default(Vector3);
|
|
Vector3 vector9 = default(Vector3);
|
|
bool flag = true;
|
|
bool flag2 = true;
|
|
bool flag3 = true;
|
|
bool flag4 = true;
|
|
bool flag5 = true;
|
|
bool flag6 = true;
|
|
bool flag7 = true;
|
|
Vector3 vector10 = Vector3.zero;
|
|
Vector4 vector11 = default(Vector4);
|
|
float num = default(float);
|
|
float num2 = default(float);
|
|
float num3 = 0f;
|
|
if (x + 1 > resolution - 1)
|
|
{
|
|
if (preterrain1.neighbor.right > -1)
|
|
{
|
|
vector6 = vertex[preterrain1.neighbor.right].vertices[1] + new Vector3(size.x, 0f, 0f);
|
|
vector9 = vertex[preterrain1.neighbor.right].vertices[1 + resolution] + new Vector3(size.x, 0f, 0f);
|
|
if (preterrain1.neighbor.bottom_right > -1)
|
|
{
|
|
vector4 = vertex[preterrain1.neighbor.bottom_right].vertices[1 + resolution * (resolution - 2)] + new Vector3(size.x, 0f, 0f - size.z);
|
|
}
|
|
else
|
|
{
|
|
flag3 = false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
flag3 = false;
|
|
flag5 = false;
|
|
flag7 = false;
|
|
}
|
|
if (preterrain1.neighbor.bottom > -1)
|
|
{
|
|
vector2 = vertex[preterrain1.neighbor.bottom].vertices[x - 1 + resolution * (resolution - 2)] - new Vector3(0f, 0f, size.z);
|
|
vector3 = vertex[preterrain1.neighbor.bottom].vertices[x + resolution * (resolution - 2)] - new Vector3(0f, 0f, size.z);
|
|
}
|
|
else
|
|
{
|
|
flag = false;
|
|
flag2 = false;
|
|
}
|
|
vector7 = vertex[preterrain1.index].vertices[x - 1 + resolution];
|
|
vector5 = vertex[preterrain1.index].vertices[x - 1];
|
|
}
|
|
else if (x - 1 < 0)
|
|
{
|
|
if (preterrain1.neighbor.left > -1)
|
|
{
|
|
vector7 = vertex[preterrain1.neighbor.left].vertices[resolution - 2 + resolution] - new Vector3(size.x, 0f, 0f);
|
|
vector5 = vertex[preterrain1.neighbor.left].vertices[resolution - 2] - new Vector3(size.x, 0f, 0f);
|
|
if (preterrain1.neighbor.bottom_left > -1)
|
|
{
|
|
vector2 = vertex[preterrain1.neighbor.bottom_left].vertices[resolution - 2 + resolution * (resolution - 2)] - new Vector3(size.x, 0f, size.z);
|
|
}
|
|
else
|
|
{
|
|
flag = false;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
flag = false;
|
|
flag4 = false;
|
|
flag6 = false;
|
|
}
|
|
if (preterrain1.neighbor.bottom > -1)
|
|
{
|
|
vector3 = vertex[preterrain1.neighbor.bottom].vertices[x + resolution * (resolution - 2)] - new Vector3(0f, 0f, size.z);
|
|
vector4 = vertex[preterrain1.neighbor.bottom].vertices[x + 1 + resolution * (resolution - 2)] - new Vector3(0f, 0f, size.z);
|
|
}
|
|
else
|
|
{
|
|
flag2 = false;
|
|
flag3 = false;
|
|
}
|
|
vector9 = vertex[preterrain1.index].vertices[x + 1 + resolution];
|
|
vector6 = vertex[preterrain1.index].vertices[x + 1];
|
|
}
|
|
else
|
|
{
|
|
if (preterrain1.neighbor.bottom > -1)
|
|
{
|
|
vector2 = vertex[preterrain1.neighbor.bottom].vertices[x - 1 + resolution * (resolution - 2)] - new Vector3(0f, 0f, size.z);
|
|
vector3 = vertex[preterrain1.neighbor.bottom].vertices[x + resolution * (resolution - 2)] - new Vector3(0f, 0f, size.z);
|
|
vector4 = vertex[preterrain1.neighbor.bottom].vertices[x + 1 + resolution * (resolution - 2)] - new Vector3(0f, 0f, size.z);
|
|
}
|
|
else
|
|
{
|
|
flag = false;
|
|
flag2 = false;
|
|
flag3 = false;
|
|
}
|
|
vector7 = vertex[preterrain1.index].vertices[x - 1 + resolution];
|
|
vector9 = vertex[preterrain1.index].vertices[x + 1 + resolution];
|
|
vector5 = vertex[preterrain1.index].vertices[x - 1];
|
|
vector6 = vertex[preterrain1.index].vertices[x + 1];
|
|
}
|
|
vector = vertex[preterrain1.index].vertices[x];
|
|
vector8 = vertex[preterrain1.index].vertices[x + resolution];
|
|
if (flag && flag2)
|
|
{
|
|
vector10 = Vector3.Cross(vector2 - vector, vector3 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag3 && flag2)
|
|
{
|
|
vector10 += Vector3.Cross(vector3 - vector, vector4 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag && flag4)
|
|
{
|
|
vector10 += Vector3.Cross(vector5 - vector, vector2 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag3 && flag5)
|
|
{
|
|
vector10 += Vector3.Cross(vector4 - vector, vector6 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag6 && flag4)
|
|
{
|
|
vector10 += Vector3.Cross(vector7 - vector, vector5 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag5 && flag7)
|
|
{
|
|
vector10 += Vector3.Cross(vector6 - vector, vector9 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag6)
|
|
{
|
|
vector10 += Vector3.Cross(vector8 - vector, vector7 - vector);
|
|
num3 += 1f;
|
|
}
|
|
if (flag7)
|
|
{
|
|
vector10 += Vector3.Cross(vector9 - vector, vector8 - vector);
|
|
num3 += 1f;
|
|
}
|
|
vector10 = (vector10 / num3).normalized;
|
|
vector10.y *= -1f;
|
|
normal_class2.normal = vector10;
|
|
num = ((!flag4) ? vector.y : vector5.y);
|
|
num2 = ((!flag5) ? vector.y : vector6.y);
|
|
normal_class2.tangent = new Vector4(0f - space, num2 - num, 0f, 0f - space).normalized;
|
|
return normal_class2;
|
|
}
|
|
|
|
public virtual void set_terrains_neighbor()
|
|
{
|
|
int num = default(int);
|
|
for (int i = 0; i < terrains.Count; i++)
|
|
{
|
|
if ((bool)terrains[i].terrain)
|
|
{
|
|
num = search_tile((int)(terrains[i].tile_x - 1f), (int)terrains[i].tile_z);
|
|
if (num != -1)
|
|
{
|
|
terrains[i].neighbor.left = num;
|
|
}
|
|
else
|
|
{
|
|
terrains[i].neighbor.left = -1;
|
|
}
|
|
num = search_tile((int)terrains[i].tile_x, (int)(terrains[i].tile_z - 1f));
|
|
if (num != -1)
|
|
{
|
|
terrains[i].neighbor.top = num;
|
|
}
|
|
else
|
|
{
|
|
terrains[i].neighbor.top = -1;
|
|
}
|
|
num = search_tile((int)(terrains[i].tile_x + 1f), (int)terrains[i].tile_z);
|
|
if (num != -1)
|
|
{
|
|
terrains[i].neighbor.right = num;
|
|
}
|
|
else
|
|
{
|
|
terrains[i].neighbor.right = -1;
|
|
}
|
|
num = search_tile((int)terrains[i].tile_x, (int)(terrains[i].tile_z + 1f));
|
|
if (num != -1)
|
|
{
|
|
terrains[i].neighbor.bottom = num;
|
|
}
|
|
else
|
|
{
|
|
terrains[i].neighbor.bottom = -1;
|
|
}
|
|
num = search_tile((int)(terrains[i].tile_x + 1f), (int)(terrains[i].tile_z + 1f));
|
|
if (num != -1)
|
|
{
|
|
terrains[i].neighbor.bottom_right = num;
|
|
}
|
|
else
|
|
{
|
|
terrains[i].neighbor.bottom_right = -1;
|
|
}
|
|
num = search_tile((int)(terrains[i].tile_x - 1f), (int)(terrains[i].tile_z + 1f));
|
|
if (num != -1)
|
|
{
|
|
terrains[i].neighbor.bottom_left = num;
|
|
}
|
|
else
|
|
{
|
|
terrains[i].neighbor.bottom_left = -1;
|
|
}
|
|
num = search_tile((int)(terrains[i].tile_x + 1f), (int)(terrains[i].tile_z - 1f));
|
|
if (num != -1)
|
|
{
|
|
terrains[i].neighbor.top_right = num;
|
|
}
|
|
else
|
|
{
|
|
terrains[i].neighbor.top_right = -1;
|
|
}
|
|
num = search_tile((int)(terrains[i].tile_x - 1f), (int)(terrains[i].tile_z - 1f));
|
|
if (num != -1)
|
|
{
|
|
terrains[i].neighbor.top_left = num;
|
|
}
|
|
else
|
|
{
|
|
terrains[i].neighbor.top_left = -1;
|
|
}
|
|
terrains[i].neighbor.self = i;
|
|
terrains[i].index = i;
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void load_raw_heightmaps()
|
|
{
|
|
filter_class filter_class2 = null;
|
|
ulong num = default(ulong);
|
|
ulong num2 = default(ulong);
|
|
for (int i = 0; i < prelayers.Count; i++)
|
|
{
|
|
for (int j = 0; j < prelayers[i].layer.Count; j++)
|
|
{
|
|
for (int k = 0; k < prelayers[i].layer[j].prefilter.filter_index.Count; k++)
|
|
{
|
|
filter_class2 = filter[prelayers[i].layer[j].prefilter.filter_index[k]];
|
|
if (filter_class2.type == condition_type_enum.RawHeightmap)
|
|
{
|
|
for (int l = 0; l < filter_class2.raw.file_index.Count; l++)
|
|
{
|
|
if (filter_class2.raw.file_index[l] > -1)
|
|
{
|
|
if (!raw_files[filter_class2.raw.file_index[l]].loaded)
|
|
{
|
|
if (!raw_files[filter_class2.raw.file_index[l]].exists())
|
|
{
|
|
if (script_base != null)
|
|
{
|
|
script_base.erase_raw_file(l);
|
|
}
|
|
erase_raw_file(l);
|
|
filter_class2.raw.file_index.RemoveAt(l);
|
|
l--;
|
|
if (filter_class2.raw.file_index.Count == 0)
|
|
{
|
|
erase_filter(k, prelayers[i].layer[j].prefilter);
|
|
k--;
|
|
}
|
|
continue;
|
|
}
|
|
raw_files[filter_class2.raw.file_index[l]].bytes = File.ReadAllBytes(raw_files[filter_class2.raw.file_index[l]].file);
|
|
num = (uint)raw_files[filter_class2.raw.file_index[l]].bytes.Length;
|
|
num2 = (ulong)(raw_files[filter_class2.raw.file_index[l]].resolution.x * raw_files[filter_class2.raw.file_index[l]].resolution.y * 2f);
|
|
if (num != num2)
|
|
{
|
|
Debug.Log("Prelayer" + i + " -> Layer" + j + " -> Filter" + l + "\nThe Raw Heightmap file '" + raw_files[filter_class2.raw.file_index[l]].file + "' has a lower resolution than selected. Please check the File size. It should be X*Y*2 = " + raw_files[filter_class2.raw.file_index[l]].resolution.x + "*" + raw_files[filter_class2.raw.file_index[l]].resolution.y + "*2 = " + raw_files[filter_class2.raw.file_index[l]].resolution.x * raw_files[filter_class2.raw.file_index[l]].resolution.y * 2f + " Bytes (" + raw_files[filter_class2.raw.file_index[l]].resolution.x + "*" + raw_files[filter_class2.raw.file_index[l]].resolution.y + " resolution). But the File size is " + raw_files[filter_class2.raw.file_index[l]].bytes.Length + " Bytes (" + Mathf.Round(Mathf.Sqrt(raw_files[filter_class2.raw.file_index[l]].bytes.Length / 2)) + "x" + Mathf.Round(Mathf.Sqrt(raw_files[filter_class2.raw.file_index[l]].bytes.Length / 2)) + " resolution).");
|
|
erase_raw_file(l);
|
|
filter_class2.raw.file_index.RemoveAt(l);
|
|
l--;
|
|
if (filter_class2.raw.file_index.Count == 0)
|
|
{
|
|
erase_filter(k, prelayers[i].layer[j].prefilter);
|
|
k--;
|
|
}
|
|
continue;
|
|
}
|
|
raw_files[filter_class2.raw.file_index[l]].loaded = true;
|
|
}
|
|
if (i == 0 && !prelayers[0].prearea.active)
|
|
{
|
|
filter_class2.raw.set_raw_auto_scale(terrains[0], terrains[0].prearea.area_old, raw_files, l);
|
|
}
|
|
else
|
|
{
|
|
filter_class2.raw.set_raw_auto_scale(terrains[0], prelayers[i].prearea.area_old, raw_files, l);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
filter_class2.raw.file_index.RemoveAt(l);
|
|
l--;
|
|
if (filter_class2.raw.file_index.Count == 0)
|
|
{
|
|
erase_filter(k, prelayers[i].layer[j].prefilter);
|
|
k--;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
load_raw_subfilter(filter_class2, i, j);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void load_raw_subfilter(filter_class filter1, int count_prelayer1, int count_layer1)
|
|
{
|
|
subfilter_class subfilter_class2 = null;
|
|
ulong num = default(ulong);
|
|
ulong num2 = default(ulong);
|
|
for (int i = 0; i < filter1.presubfilter.subfilter_index.Count; i++)
|
|
{
|
|
subfilter_class2 = subfilter[filter1.presubfilter.subfilter_index[i]];
|
|
if (subfilter_class2.type != condition_type_enum.RawHeightmap)
|
|
{
|
|
continue;
|
|
}
|
|
for (int j = 0; j < subfilter_class2.raw.file_index.Count; j++)
|
|
{
|
|
if (subfilter_class2.raw.file_index[j] > -1)
|
|
{
|
|
if (!raw_files[subfilter_class2.raw.file_index[j]].loaded)
|
|
{
|
|
if (!raw_files[subfilter_class2.raw.file_index[j]].exists())
|
|
{
|
|
script.erase_raw_file(j);
|
|
erase_raw_file(j);
|
|
subfilter_class2.raw.file_index.RemoveAt(j);
|
|
j--;
|
|
if (subfilter_class2.raw.file_index.Count == 0)
|
|
{
|
|
erase_subfilter(i, filter1.presubfilter);
|
|
i--;
|
|
}
|
|
continue;
|
|
}
|
|
raw_files[subfilter_class2.raw.file_index[j]].bytes = File.ReadAllBytes(raw_files[subfilter_class2.raw.file_index[j]].file);
|
|
num = (uint)raw_files[subfilter_class2.raw.file_index[j]].bytes.Length;
|
|
num2 = (ulong)(raw_files[subfilter_class2.raw.file_index[j]].resolution.x * raw_files[subfilter_class2.raw.file_index[j]].resolution.y * 2f);
|
|
if (num != num2)
|
|
{
|
|
Debug.Log("Prelayer" + count_prelayer1 + " -> Layer" + count_layer1 + " -> subfilter" + j + "\nThe Raw Heightmap file '" + raw_files[subfilter_class2.raw.file_index[j]].file + "' has a lower resolution than selected. Please check the File size. It should be X*Y*2 = " + raw_files[subfilter_class2.raw.file_index[j]].resolution.x + "*" + raw_files[subfilter_class2.raw.file_index[j]].resolution.y + "*2 = " + raw_files[subfilter_class2.raw.file_index[j]].resolution.x * raw_files[subfilter_class2.raw.file_index[j]].resolution.y * 2f + " Bytes (" + raw_files[subfilter_class2.raw.file_index[j]].resolution.x + "*" + raw_files[subfilter_class2.raw.file_index[j]].resolution.y + " resolution). But the File size is " + raw_files[subfilter_class2.raw.file_index[j]].bytes.Length + " Bytes (" + Mathf.Round(Mathf.Sqrt(raw_files[subfilter_class2.raw.file_index[j]].bytes.Length / 2)) + "x" + Mathf.Round(Mathf.Sqrt(raw_files[subfilter_class2.raw.file_index[j]].bytes.Length / 2)) + " resolution).");
|
|
erase_raw_file(j);
|
|
subfilter_class2.raw.file_index.RemoveAt(j);
|
|
j--;
|
|
if (subfilter_class2.raw.file_index.Count == 0)
|
|
{
|
|
erase_subfilter(i, filter1.presubfilter);
|
|
i--;
|
|
}
|
|
continue;
|
|
}
|
|
raw_files[subfilter_class2.raw.file_index[j]].loaded = true;
|
|
}
|
|
if (count_prelayer1 == 0 && !prelayers[0].prearea.active)
|
|
{
|
|
subfilter_class2.raw.set_raw_auto_scale(terrains[0], terrains[0].prearea.area_old, raw_files, j);
|
|
}
|
|
else
|
|
{
|
|
subfilter_class2.raw.set_raw_auto_scale(terrains[0], prelayers[count_prelayer1].prearea.area_old, raw_files, j);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
subfilter_class2.raw.file_index.RemoveAt(j);
|
|
j--;
|
|
if (subfilter_class2.raw.file_index.Count == 0)
|
|
{
|
|
erase_subfilter(i, filter1.presubfilter);
|
|
i--;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public virtual void Main()
|
|
{
|
|
}
|
|
}
|