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

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'io_convert_image_to_mesh_img/ui/terrainpanel.py')
-rw-r--r--io_convert_image_to_mesh_img/ui/terrainpanel.py133
1 files changed, 133 insertions, 0 deletions
diff --git a/io_convert_image_to_mesh_img/ui/terrainpanel.py b/io_convert_image_to_mesh_img/ui/terrainpanel.py
new file mode 100644
index 00000000..80dfe8e4
--- /dev/null
+++ b/io_convert_image_to_mesh_img/ui/terrainpanel.py
@@ -0,0 +1,133 @@
+# This file is a part of the HiRISE DTM Importer for Blender
+#
+# Copyright (C) 2017 Arizona Board of Regents on behalf of the Planetary Image
+# Research Laboratory, Lunar and Planetary Laboratory at the University of
+# Arizona.
+#
+# This program is free software: you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+# for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program. If not, see <http://www.gnu.org/licenses/>.
+
+"""Blender panel for managing a DTM *after* it's been imported"""
+
+import bpy
+
+from ..mesh.terrain import BTerrain
+from ..mesh.dtm import DTM
+
+
+class TerrainPanel(bpy.types.Panel):
+ """Creates a Panel in the Object properites window for terrain objects"""
+ bl_label = "Terrain Model"
+ bl_idname = "OBJECT_PT_terrain"
+ bl_space_type = "PROPERTIES"
+ bl_region_type = "WINDOW"
+ bl_context = "object"
+
+ # Allow the user to specify a new resolution factor for reloading the
+ # terrain data at. This is useful because it allows the user to stage
+ # a scene with a low resolution terrain map, apply textures, modifiers,
+ # etc. and then increase the resolution to prepare for final rendering.
+ #
+ # Displaying this value as a percentage (0, 100] is an intuitive way
+ # for users to grasp what this value does. The DTM importer, however,
+ # wants to recieve a value between (0, 1]. This is obviously a
+ # straightforward conversion:
+ #
+ # f(x) = x / 100
+ #
+ # But this conversion should happen here, in the terrain panel, rather
+ # than in the DTM importing utility itself. We can't pass get/set
+ # functions to the property itself because they result in a recursion
+ # error. Instead, we use another, hidden, property to store the scaled
+ # resolution.
+ bpy.types.Object.dtm_resolution = bpy.props.FloatProperty(
+ subtype="PERCENTAGE",
+ name="New Resolution",
+ description=(
+ "Percentage scale for terrain model resolution. 100\% loads the "
+ "model at full resolution (i.e. one vertex for each post in the "
+ "original terrain model) and is *MEMORY INTENSIVE*. Downsampling "
+ "uses Nearest Neighbors. The downsampling algorithm may need to "
+ "alter the resolution you specify here to ensure it results in a "
+ "whole number of vertices. If it needs to alter the value you "
+ "specify, you are guaranteed that it will shrink it (i.e. "
+ "decrease the DTM resolution."
+ ),
+ min=1.0, max=100.0, default=10.0
+ )
+ bpy.types.Object.scaled_dtm_resolution = bpy.props.FloatProperty(
+ options={'HIDDEN'},
+ name="Scaled Terrain Model Resolution",
+ get=(lambda self: self.dtm_resolution / 100.0)
+ )
+
+ @classmethod
+ def poll(cls, context):
+ return context.object.get("IS_TERRAIN", False)
+
+ def draw(self, context):
+ obj = context.active_object
+ layout = self.layout
+
+ # User Controls
+ layout.prop(obj, 'dtm_resolution')
+ layout.operator("terrain.reload")
+
+ # Metadata
+ self.draw_metadata_panel(context)
+
+ def draw_metadata_panel(self, context):
+ """Display some metadata about the DTM"""
+ obj = context.active_object
+ layout = self.layout
+
+ metadata_panel = layout.box()
+
+ dtm_resolution = metadata_panel.row()
+ dtm_resolution.label('Current Resolution: ')
+ dtm_resolution.label('{:9,.2%}'.format(
+ obj['DTM_RESOLUTION']
+ ))
+
+ mesh_scale = metadata_panel.row()
+ mesh_scale.label('Current Scale: ')
+ mesh_scale.label('{:9,.2f} m/post'.format(
+ obj['MESH_SCALE']
+ ))
+
+ dtm_scale = metadata_panel.row()
+ dtm_scale.label('Original Scale: ')
+ dtm_scale.label('{:9,.2f} m/post'.format(
+ obj['MAP_SCALE']
+ ))
+
+ return {'FINISHED'}
+
+
+class ReloadTerrain(bpy.types.Operator):
+ """Button for reloading the terrain mesh at a new resolution."""
+ bl_idname = "terrain.reload"
+ bl_label = "Reload Terrain"
+
+ def execute(self, context):
+ # Reload the terrain
+ obj = context.object
+ path = obj['PATH']
+
+ scaled_dtm_resolution = obj.scaled_dtm_resolution
+
+ # Reload BTerrain with new DTM
+ dtm = DTM(path, scaled_dtm_resolution)
+ BTerrain.reload(obj, dtm)
+
+ return {"FINISHED"}