Add support for area lights to the Apply Transform operator
authorLukas Stockner <lukas.stockner@freenet.de>
Mon, 30 Apr 2018 20:05:03 +0000 (22:05 +0200)
committerLukas Stockner <lukas.stockner@freenet.de>
Mon, 30 Apr 2018 20:09:23 +0000 (22:09 +0200)
Since area lights are affected by scaling them, it only makes sense to support applying the scale to the lamp size.
Of course, applying location or rotation does not work.

If a scaling that changes the aspect ratio is applied to a square lamp, the mode is automatically changed to Rectangle.

source/blender/editors/object/object_transform.c

index 05f98026e18d9e7683b62cf4cdcb062c45d7a5dc..e29d49d00cbe24c6f9edc8e5766de74cf2cc87be 100644 (file)
@@ -35,6 +35,7 @@
 #include "DNA_armature_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_meta_types.h"
+#include "DNA_lamp_types.h"
 #include "DNA_object_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_group_types.h"
@@ -472,6 +473,18 @@ static int apply_objects_internal(
                                changed = false;
                        }
                }
+
+               if (ob->type == OB_LAMP) {
+                       Lamp *la = ob->data;
+                       if (la->type == LA_AREA) {
+                               if (apply_rot || apply_loc) {
+                                       BKE_reportf(reports, RPT_ERROR,
+                                                   "Area Lamps can only have scale applied: \"%s\"",
+                                                   ob->id.name + 2);
+                                       changed = false;
+                               }
+                       }
+               }
        }
        CTX_DATA_END;
        
@@ -601,6 +614,22 @@ static int apply_objects_internal(
                                ob->empty_drawsize *= max_scale;
                        }
                }
+               else if (ob->type == OB_LAMP) {
+                       Lamp *la = ob->data;
+                       if (la->type != LA_AREA) {
+                               continue;
+                       }
+
+                       bool keeps_aspect_ratio = compare_ff_relative(rsmat[0][0], rsmat[1][1], FLT_EPSILON, 64);
+                       if ((la->area_shape == LA_AREA_SQUARE) && !keeps_aspect_ratio) {
+                               la->area_shape = LA_AREA_RECT;
+                               la->area_sizey = la->area_size;
+                       }
+
+                       la->area_size *= rsmat[0][0];
+                       la->area_sizey *= rsmat[1][1];
+                       la->area_sizez *= rsmat[2][2];
+               }
                else {
                        continue;
                }