UV Edit: move uv vertex buttons code to uvedit module.

This commit is contained in:
2011-05-02 11:11:57 +00:00
parent 02fbaede8f
commit 438f604d15
5 changed files with 243 additions and 156 deletions

View File

@@ -32,12 +32,13 @@
#ifndef ED_UVEDIT_H
#define ED_UVEDIT_H
struct bContext;
struct Scene;
struct Object;
struct MTFace;
struct ARegionType;
struct EditFace;
struct Image;
struct MTFace;
struct Object;
struct Scene;
struct bContext;
struct wmKeyConfig;
/* uvedit_ops.c */
@@ -77,5 +78,8 @@ void ED_unwrap_lscm(struct Scene *scene, struct Object *obedit, const short sel)
/* uvedit_draw.c */
void draw_uvedit_main(struct SpaceImage *sima, struct ARegion *ar, struct Scene *scene, struct Object *obedit);
/* uvedit_buttons.c */
void ED_uvedit_buttons_register(struct ARegionType *art);
#endif /* ED_UVEDIT_H */

View File

@@ -63,8 +63,6 @@
#include "ED_gpencil.h"
#include "ED_image.h"
#include "ED_screen.h"
#include "ED_uvedit.h"
#include "RNA_access.h"
@@ -78,7 +76,6 @@
#define B_REDR 1
#define B_IMAGECHANGED 2
#define B_TRANS_IMAGE 3
#define B_NOP 0
#define B_TWINANIM 5
#define B_SIMAGETILE 6
@@ -100,8 +97,6 @@
#define B_SIMACLONEDELETE 26
/* proto */
static void image_editvertex_buts(const bContext *C, uiBlock *block);
static void do_image_panel_events(bContext *C, void *UNUSED(arg), int event)
{
@@ -110,9 +105,6 @@ static void do_image_panel_events(bContext *C, void *UNUSED(arg), int event)
switch(event) {
case B_REDR:
break;
case B_TRANS_IMAGE:
image_editvertex_buts(C, NULL);
break;
}
/* all events now */
@@ -193,127 +185,6 @@ struct ImageUser *ntree_get_active_iuser(bNodeTree *ntree)
/* ************ panel stuff ************* */
/* this function gets the values for cursor and vertex number buttons */
static void image_transform_but_attr(SpaceImage *sima, int *imx, int *imy, int *step, int *digits) /*, float *xcoord, float *ycoord)*/
{
ED_space_image_size(sima, imx, imy);
if (sima->flag & SI_COORDFLOATS) {
*step= 1;
*digits= 3;
}
else {
*step= 100;
*digits= 2;
}
}
/* is used for both read and write... */
static void image_editvertex_buts(const bContext *C, uiBlock *block)
{
Scene *scene= CTX_data_scene(C);
SpaceImage *sima= CTX_wm_space_image(C);
Image *ima= sima->image;
Object *obedit= CTX_data_edit_object(C);
static float ocent[2];
float cent[2]= {0.0, 0.0};
int imx= 256, imy= 256;
int nactive= 0, step, digits;
EditMesh *em;
EditFace *efa;
MTFace *tf;
image_transform_but_attr(sima, &imx, &imy, &step, &digits);
em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
for (efa= em->faces.first; efa; efa= efa->next) {
tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if (uvedit_face_visible(scene, ima, efa, tf)) {
if (uvedit_uv_selected(scene, efa, tf, 0)) {
cent[0]+= tf->uv[0][0];
cent[1]+= tf->uv[0][1];
nactive++;
}
if (uvedit_uv_selected(scene, efa, tf, 1)) {
cent[0]+= tf->uv[1][0];
cent[1]+= tf->uv[1][1];
nactive++;
}
if (uvedit_uv_selected(scene, efa, tf, 2)) {
cent[0]+= tf->uv[2][0];
cent[1]+= tf->uv[2][1];
nactive++;
}
if (efa->v4 && uvedit_uv_selected(scene, efa, tf, 3)) {
cent[0]+= tf->uv[3][0];
cent[1]+= tf->uv[3][1];
nactive++;
}
}
}
if(block) { // do the buttons
if (nactive) {
ocent[0]= cent[0]/nactive;
ocent[1]= cent[1]/nactive;
if (sima->flag & SI_COORDFLOATS) {
} else {
ocent[0] *= imx;
ocent[1] *= imy;
}
uiBlockBeginAlign(block);
uiDefButF(block, NUM, B_TRANS_IMAGE, "X:", 10, 10, 145, 19, &ocent[0], -10*imx, 10.0*imx, step, digits, "");
uiDefButF(block, NUM, B_TRANS_IMAGE, "Y:", 165, 10, 145, 19, &ocent[1], -10*imy, 10.0*imy, step, digits, "");
uiBlockEndAlign(block);
}
}
else { // apply event
float delta[2];
cent[0]= cent[0]/nactive;
cent[1]= cent[1]/nactive;
if (sima->flag & SI_COORDFLOATS) {
delta[0]= ocent[0]-cent[0];
delta[1]= ocent[1]-cent[1];
}
else {
delta[0]= ocent[0]/imx - cent[0];
delta[1]= ocent[1]/imy - cent[1];
}
for (efa= em->faces.first; efa; efa= efa->next) {
tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if (uvedit_face_visible(scene, ima, efa, tf)) {
if (uvedit_uv_selected(scene, efa, tf, 0)) {
tf->uv[0][0]+= delta[0];
tf->uv[0][1]+= delta[1];
}
if (uvedit_uv_selected(scene, efa, tf, 1)) {
tf->uv[1][0]+= delta[0];
tf->uv[1][1]+= delta[1];
}
if (uvedit_uv_selected(scene, efa, tf, 2)) {
tf->uv[2][0]+= delta[0];
tf->uv[2][1]+= delta[1];
}
if (efa->v4 && uvedit_uv_selected(scene, efa, tf, 3)) {
tf->uv[3][0]+= delta[0];
tf->uv[3][1]+= delta[1];
}
}
}
WM_event_add_notifier(C, NC_IMAGE, sima->image);
}
BKE_mesh_end_editmesh(obedit->data, em);
}
/* is used for both read and write... */
static int image_panel_poll(const bContext *C, PanelType *UNUSED(pt))
@@ -976,22 +847,6 @@ void uiTemplateImageLayers(uiLayout *layout, bContext *C, Image *ima, ImageUser
}
}
static int image_panel_uv_poll(const bContext *C, PanelType *UNUSED(pt))
{
Object *obedit= CTX_data_edit_object(C);
return ED_uvedit_test(obedit);
}
static void image_panel_uv(const bContext *C, Panel *pa)
{
uiBlock *block;
block= uiLayoutAbsoluteBlock(pa->layout);
uiBlockSetHandleFunc(block, do_image_panel_events, NULL);
image_editvertex_buts(C, block);
}
void image_buttons_register(ARegionType *art)
{
PanelType *pt;
@@ -1009,13 +864,6 @@ void image_buttons_register(ARegionType *art)
strcpy(pt->label, "Grease Pencil");
pt->draw= gpencil_panel_standard;
BLI_addtail(&art->paneltypes, pt);
pt= MEM_callocN(sizeof(PanelType), "spacetype image panel uv");
strcpy(pt->idname, "IMAGE_PT_uv");
strcpy(pt->label, "UV Vertex");
pt->draw= image_panel_uv;
pt->poll= image_panel_uv_poll;
BLI_addtail(&art->paneltypes, pt);
}
static int image_properties(bContext *C, wmOperator *UNUSED(op))

View File

@@ -989,6 +989,7 @@ void ED_spacetype_image(void)
BLI_addhead(&st->regiontypes, art);
image_buttons_register(art);
ED_uvedit_buttons_register(art);
/* regions: statistics/scope buttons */
art= MEM_callocN(sizeof(ARegionType), "spacetype image region");

View File

@@ -33,6 +33,7 @@ set(INC
)
set(SRC
uvedit_buttons.c
uvedit_draw.c
uvedit_ops.c
uvedit_parametrizer.c

View File

@@ -0,0 +1,233 @@
/*
* $Id$
*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* 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 2
* 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, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
* All rights reserved.
*
* Contributor(s): Blender Foundation, 2002-2009
*
* ***** END GPL LICENSE BLOCK *****
*/
/** \file blender/editors/uvedit/uvedit_buttons.c
* \ingroup eduv
*/
#include <string.h>
#include <stdio.h>
#include "MEM_guardedalloc.h"
#include "DNA_meshdata_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_screen_types.h"
#include "DNA_space_types.h"
#include "BLI_blenlib.h"
#include "BLI_math.h"
#include "BLI_editVert.h"
#include "BLI_utildefines.h"
#include "BKE_context.h"
#include "BKE_customdata.h"
#include "BKE_mesh.h"
#include "BKE_screen.h"
#include "ED_image.h"
#include "ED_uvedit.h"
#include "UI_interface.h"
#include "UI_resources.h"
#include "WM_api.h"
#include "WM_types.h"
#define B_UVEDIT_VERTEX 3
/* UV Utilities */
static int uvedit_center(Scene *scene, EditMesh *em, Image *ima, float center[2])
{
EditFace *efa;
MTFace *tf;
int tot= 0;
zero_v2(center);
for(efa= em->faces.first; efa; efa= efa->next) {
tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if(uvedit_face_visible(scene, ima, efa, tf)) {
if(uvedit_uv_selected(scene, efa, tf, 0)) {
add_v2_v2(center, tf->uv[0]);
tot++;
}
if(uvedit_uv_selected(scene, efa, tf, 1)) {
add_v2_v2(center, tf->uv[1]);
tot++;
}
if(uvedit_uv_selected(scene, efa, tf, 2)) {
add_v2_v2(center, tf->uv[2]);
tot++;
}
if(efa->v4 && uvedit_uv_selected(scene, efa, tf, 3)) {
add_v2_v2(center, tf->uv[3]);
tot++;
}
}
}
if(tot > 0) {
center[0] /= tot;
center[1] /= tot;
}
return tot;
}
static void uvedit_translate(Scene *scene, EditMesh *em, Image *ima, float delta[2])
{
EditFace *efa;
MTFace *tf;
for(efa= em->faces.first; efa; efa= efa->next) {
tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if(uvedit_face_visible(scene, ima, efa, tf)) {
if(uvedit_uv_selected(scene, efa, tf, 0))
add_v2_v2(tf->uv[0], delta);
if(uvedit_uv_selected(scene, efa, tf, 1))
add_v2_v2(tf->uv[1], delta);
if(uvedit_uv_selected(scene, efa, tf, 2))
add_v2_v2(tf->uv[2], delta);
if(efa->v4 && uvedit_uv_selected(scene, efa, tf, 3))
add_v2_v2(tf->uv[3], delta);
}
}
}
/* Button Functions, using an evil static variable */
static float uvedit_old_center[2];
static void uvedit_vertex_buttons(const bContext *C, uiBlock *block)
{
SpaceImage *sima= CTX_wm_space_image(C);
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
Image *ima= sima->image;
float center[2];
int imx, imy, step, digits;
EditMesh *em;
ED_space_image_size(sima, &imx, &imy);
em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
if(uvedit_center(scene, em, ima, center)) {
copy_v2_v2(uvedit_old_center, center);
if(!(sima->flag & SI_COORDFLOATS)) {
uvedit_old_center[0] *= imx;
uvedit_old_center[1] *= imy;
}
if(sima->flag & SI_COORDFLOATS) {
step= 1;
digits= 3;
}
else {
step= 100;
digits= 2;
}
uiBlockBeginAlign(block);
uiDefButF(block, NUM, B_UVEDIT_VERTEX, "X:", 10, 10, 145, 19, &uvedit_old_center[0], -10*imx, 10.0*imx, step, digits, "");
uiDefButF(block, NUM, B_UVEDIT_VERTEX, "Y:", 165, 10, 145, 19, &uvedit_old_center[1], -10*imy, 10.0*imy, step, digits, "");
uiBlockEndAlign(block);
}
BKE_mesh_end_editmesh(obedit->data, em);
}
static void do_uvedit_vertex(bContext *C, void *UNUSED(arg), int event)
{
SpaceImage *sima= CTX_wm_space_image(C);
Scene *scene= CTX_data_scene(C);
Object *obedit= CTX_data_edit_object(C);
Image *ima= sima->image;
EditMesh *em;
float center[2], delta[2];
int imx, imy;
if(event != B_UVEDIT_VERTEX)
return;
em= BKE_mesh_get_editmesh((Mesh *)obedit->data);
ED_space_image_size(sima, &imx, &imy);
uvedit_center(scene, em, ima, center);
if(sima->flag & SI_COORDFLOATS) {
delta[0]= uvedit_old_center[0] - center[0];
delta[1]= uvedit_old_center[1] - center[1];
}
else {
delta[0]= uvedit_old_center[0]/imx - center[0];
delta[1]= uvedit_old_center[1]/imy - center[1];
}
uvedit_translate(scene, em, ima, delta);
BKE_mesh_end_editmesh(obedit->data, em);
WM_event_add_notifier(C, NC_IMAGE, sima->image);
}
/* Panels */
static int image_panel_uv_poll(const bContext *C, PanelType *UNUSED(pt))
{
Object *obedit= CTX_data_edit_object(C);
return ED_uvedit_test(obedit);
}
static void image_panel_uv(const bContext *C, Panel *pa)
{
uiBlock *block;
block= uiLayoutAbsoluteBlock(pa->layout);
uiBlockSetHandleFunc(block, do_uvedit_vertex, NULL);
uvedit_vertex_buttons(C, block);
}
void ED_uvedit_buttons_register(ARegionType *art)
{
PanelType *pt;
pt= MEM_callocN(sizeof(PanelType), "spacetype image panel uv");
strcpy(pt->idname, "IMAGE_PT_uv");
strcpy(pt->label, "UV Vertex");
pt->draw= image_panel_uv;
pt->poll= image_panel_uv_poll;
BLI_addtail(&art->paneltypes, pt);
}