MuckyFoot-UrbanChaos/fallen/Editor/Source/PaintTab.cpp
2017-05-20 11:14:17 +10:00

3538 lines
77 KiB
C++

// Guy Simmons
// 20th February 1997.
//eaworldhq@eahq-exchange.ea.com
#include "Editor.hpp"
#include "c:\fallen\headers\game.h"
#include "c:\fallen\headers\animtmap.h"
#include "c:\fallen\ddlibrary\headers\tga.h"
#include "c:\fallen\headers\memory.h"
#define SET_TEXTURE_COORDS texture_x=TextureX;if(texture_x>(256-(1<<TextureZoom)))texture_x=(256-(1<<TextureZoom)); \
texture_y=TextureY;if(texture_y>(256-(1<<TextureZoom)))texture_y=(256-(1<<TextureZoom));
#define PAINT2
//---------------------------------------------------------------
void scale_selected_tmaps(SWORD scale);
void remove_style_textures(void);
void remove_painted_textures(void);
UWORD page_remap[64*8];
SLONG show_info=0;
CBYTE texture_style_names[200][21]=
{
{" "},
{"BROWN_BRICK1"},
{"BROWN_BRICK2"},
{"GREY_RIM1"},
{"GREY_RIM2"},
{"RED_WINDOW"},
{"GREY_CORIGATED"},
{"CRATES_SMALL_BROWN"},
{"GREY_POSH"},
{"HOTEL_SIGN1"},
{"HOTEL_SIGN2"},
{" "},
{" "},
{" "},
{" "},
{" "},
{" "},
{" "}
};
MenuDef2 texture_menu[] =
{
{(CBYTE*)"World Page 1"},
{(CBYTE*)"World Page 2"},
{(CBYTE*)"World Page 3"},
{(CBYTE*)"World Page 4"},
{(CBYTE*)"Shared Page 1"},
{(CBYTE*)"Shared Page 2"},
{(CBYTE*)"Shared Page 3"},
{(CBYTE*)"Shared Page 4"},
{(CBYTE*)"Inside Page 1"},
{(CBYTE*)"People Page 1"},
{(CBYTE*)"People Page 2"},
{(CBYTE*)"Prims Page 1"},
{(CBYTE*)"Prims Page 2"},
{(CBYTE*)"Prims Page 3"},
{(CBYTE*)"other14"},
{(CBYTE*)"other15"},
{(CBYTE*)"other16"},
{(CBYTE*)"other17"},
{(CBYTE*)"other18"},
{(CBYTE*)"other19"},
{(CBYTE*)"other20"},
{(CBYTE*)"other21"},
{(CBYTE*)"other9"},
{(CBYTE*)"other1"},
{(CBYTE*)"other1"},
{(CBYTE*)"other1"},
{(CBYTE*)"other1"},
{(CBYTE*)"other1"},
{"!"}
};
MenuDef2 texture_size[] =
{
{"8"},{"16"},{"32"},{"64"},{"96"},{"128"},{"160"},{"192"},{"!"}
};
MenuDef2 texture_size2[] =
{
{"8"},{"16"},{"32"},{"64"},{"96"},{"128"},{"160"},{"192"},{"!"}
};
MenuDef2 mode_menu[] =
{
{"Palette"},{"Textures"},
{"planar"},{"ANIMS"},{"PLAN VIEW"},{"Style Paint"},{"Style Def"},{"Inside Style Def"},{"PSX Alt"},{"!"}
};
UBYTE texture_sizes[]={8,16,32,64,96,128,160,192};
//---------------------------------------------------------------
//#define CTRL_PAINT_MENU 1
//#define CTRL_PAINT_TEXT 2
/*
ControlDef paint_tab_def[] =
{
{ 0 }
};
*/
//---------------------------------------------------------------
ControlDef colour_def[] =
{
{ 0 }
};
#define CTRL_STYLE_PAINT_SLIDER 1
ControlDef style_def[] =
{
{ V_SLIDER, 0, "", 1,30, 50, 300 },
{ 0 }
};
#define CTRL_TEX_PAGE_TEXT 1
#define CTRL_TEX_PAGE_MENU 2
#define CTRL_TEX_QUAD_BOX 3
#define CTRL_TEX_FIXED_BOX 4
//#define CTRL_TEX_SIZE_MENUW 5
//#define CTRL_TEX_SIZE_MENUH 6
#define CTRL_TEX_SIZE_TEXT 5
#define CTRL_TEX_IMPORT_TEX 6
#define CTRL_TEX_TILE_SIZE 7
#define CTRL_TEX_LOAD_ANIMTMAP 8
#define CTRL_TEX_SAVE_ANIMTMAP 9
#define CTRL_TEX_ANIMTMAP_UP 10
#define CTRL_TEX_ANIMTMAP_DOWN 11
#define CTRL_TEX_SELECT_DRAWN 12
#define CTRL_TEX_PLANAR_MAP 13
#define CTRL_TEX_NO_HIDDEN 14
#define CTRL_TEX_PLANAR_MAPF 15
#define CTRL_TEX_USE_CLIPPED 16
#define CTRL_TEX_SET_CLIPPED 17
#define CTRL_TEX_ROOF_TEX 18
#define CTRL_PAINT_MENU 19
#define CTRL_PAINT_TEXT 20
#define CTRL_TEX_HIDE_L 21
#define CTRL_TEX_HIDE_R 22
#define CTRL_TEX_HIDE_ROOF 23
#define CTRL_BUILD_OTHER 24
#define CTRL_TEX_INFO 25
#define CTRL_TEX_CLEAR 26
ControlDef texture_def[] =
{
{ STATIC_TEXT, 0, "Current Page : ", 2, 334, 0, 10 },
{ PULLDOWN_MENU, 0, "Texture Page", 140, 24, 56, 10, texture_menu },
{ CHECK_BOX, 0, "Quads", 2, 370, 0, 10 },
{ CHECK_BOX, KB_F,"Fixed Textures", 2, 384, 0, 10 },
// { PULLDOWN_MENU, 0, "Texture Width", 150,340, 100, 10, texture_size },
// { PULLDOWN_MENU, 0, "Texture Height", 150,354, 100, 10, texture_size2 },
{ STATIC_TEXT, 0, "", 100,384, 0, 10 },
{ BUTTON, 0, "Import Textures", 2, 410, 0, 0 },
{ H_SLIDER, 0, "", 2, 430, 190, 0 },
{ BUTTON, 0, "Load AnimTmaps", 100, 410, 0, 0 },
{ BUTTON, 0, "Save AnimTmaps", 200, 410, 0, 0 },
{ BUTTON, 0, "UP", 273, 20, 0, 0 },
{ BUTTON, 0, "DWN", 273, 294, 0, 0 },
{ CHECK_BOX, 0, "Select Drawn", 200, 350, 0, 10 },
{ CHECK_BOX, 0, "Map1", 200, 330, 0, 10 },
{ CHECK_BOX, 0, "NoHidden", 250, 390, 0, 10 },
{ CHECK_BOX, 0, "MapF", 250, 330, 0, 10 },
{ CHECK_BOX, 0, "Use Clipping", 240, 450, 0, 10 },
{ BUTTON, 0, "Set Clipping", 240, 465, 0, 0 },
{ CHECK_BOX, 0, "Roof Textures", 40, 470, 0, 0 },
{ PULLDOWN_MENU, 0, "Paint mode", 2, 10, 0, 0, mode_menu },
{ STATIC_TEXT, 0, "Current mode : ", 14, 24, 0, 10 },
{ CHECK_BOX, 0, "Hide Left", 20, 325, 0, 0 },
{ CHECK_BOX, 0, "Hide Right", 80,325, 0, 0 },
{ CHECK_BOX, 0, "Hide Roofs", 140,325, 0, 0 },
{ BUTTON, 0, "BuildOther", 10, 350, 0, 0 },
{ BUTTON, 0, "Show Tex Info", 100, 350, 0, 0 },
{ BUTTON, 0, "ClearTex", 150, 470, 0, 0 },
{ 0 }
};
extern void sync_animtmaps(void);
void new_tile_size(void);
PaintTab *the_painttab;
//---------------------------------------------------------------
SLONG max_textures=NUM_GAME_TEXTURES - 1;
PaintTab::PaintTab(EditorModule *parent)
{
SLONG c0;
CurrentColour=0;
TextureFlags=0;
CurrentAnimTmap=0;
Parent = parent;
/*(
// Set the texture menu up for valid textures only.
// for fucks sake
for(c0=0;c0<14;c0++)
{
if(!game_textures[c0].TextureName)
break;
}
*/
max_textures=NUM_GAME_TEXTURES - 1;
// texture_menu[c0].ItemText[0] = '!';
// texture_menu[c0].ItemText[1] = 0;
// InitControlSet(paint_tab_def);
//InitControlSet(style_tab_def); //default control set used by them all
CurrentTexturePage = 0;
CurrentTextureRot = 0;
PaintMode = TEXTURE_PAINT;
load_animtmaps();
ShowAnimTmap=1;
PaletteSet.InitControlSet(colour_def);
StyleSet.InitControlSet(style_def);
InitControlSet(texture_def);
// TextureSet.InitControlSet(texture_def);
PaintRect.SetRect(14,40,258,258);
AnimRect.SetRect(276,45,19,246);
TextureWidth = 32;
TextureHeight = 32;
TextureX = 0;
TextureY = 0;
TextureZoom = 8;
SubMode=0;
SubStatus=0;
edit_info.TileScale=100;
TextureFlags= FLAGS_QUADS|FLAGS_FIXED;
SetControlState(CTRL_TEX_HIDE_L,CTRL_DESELECTED);
SetControlState(CTRL_TEX_HIDE_R,CTRL_DESELECTED);
SetControlState(CTRL_TEX_HIDE_ROOF,CTRL_DESELECTED);
SetControlState(CTRL_TEX_QUAD_BOX,CTRL_SELECTED); //ts
SetControlState(CTRL_TEX_FIXED_BOX,CTRL_SELECTED);
((CHSlider*)GetControlPtr(CTRL_TEX_TILE_SIZE))->SetValueRange(1,256);
((CHSlider*)GetControlPtr(CTRL_TEX_TILE_SIZE))->SetCurrentValue(edit_info.TileScale);
((CHSlider*)GetControlPtr(CTRL_TEX_TILE_SIZE))->SetUpdateFunction(new_tile_size);
void new_scroll_pos(void);
((CVSlider*)StyleSet.GetControlPtr(CTRL_STYLE_PAINT_SLIDER))->SetUpdateFunction(new_scroll_pos);
((CVSlider*)StyleSet.GetControlPtr(CTRL_STYLE_PAINT_SLIDER))->SetValueRange(0,60);
((CVSlider*)StyleSet.GetControlPtr(CTRL_STYLE_PAINT_SLIDER))->SetCurrentValue(1);
CurrentStyleEdit=0;
CurrentStylePos=1;
the_painttab=this;
UpdateTabInfo();
UpdatePaletteInfo();
UpdateTextureInfo();
for(c0=0;c0<4;c0++)
{
CurrentTexture.U[c0]=0;
CurrentTexture.V[c0]=0;
}
}
PaintTab::~PaintTab()
{
CutMapBlock.Free();
}
void fix_all_selected_faces_for_tile_mode(void);
extern void find_highest_selected_tmap(SLONG *tx,SLONG *ty);
/*
void scale_selected_tmaps(SLONG scale)
{
SLONG c0,c1;
struct PrimFace4 *p_f4;
struct PrimFace3 *p_f3;
SLONG tx,ty;
find_highest_selected_tmap(&tx,&ty);
scale+=32;
for(c0=1;c0<next_face_selected;c0++)
{
if(face_selected_list[c0]>0)
{
p_f4=&prim_faces4[face_selected_list[c0]];
for(c1=0;c1<4;c1++)
{
SLONG wx,wy;
wx=p_f4->UV[c1][0];
wy=p_f4->UV[c1][1];
wx=(((wx-tx)*scale)>>5)+tx;
wy=(((wy-ty)*scale)>>5)+ty;
p_f4->UV[c1][0]=wx;
p_f4->UV[c1][1]=wy;
}
}
else
if(face_selected_list[c0]<0)
{
p_f3=&prim_faces3[-face_selected_list[c0]];
for(c1=0;c1<3;c1++)
{
p_f3->UV[c1][0]=(((p_f3->UV[c1][0]-tx)*scale)>>7)+p_f4->UV[c1][0];
p_f3->UV[c1][1]=(((p_f3->UV[c1][1]-ty)*scale)>>7)+p_f3->UV[c1][1];
}
}
}
}
*/
void new_tile_size(void)
{
edit_info.TileScale = ((CHSlider*)the_painttab->GetControlPtr(CTRL_TEX_TILE_SIZE))->GetCurrentValue();
if(edit_info.TileFlag)
{
// fix_all_selected_faces_for_tile_mode();
}
else
{
// scale_selected_tmaps(tx,ty,edit_info.TileScale);
}
// the_painttab->UpdateTexture();
the_painttab->Parent->DrawContent();
// the_painttab->DrawTabContent();
/*
SetWorkWindowBounds(the_painttab->Parent->GetLeft(),
the_painttab->Parent->GetTop(),
the_painttab->Parent->GetWidth(),
the_painttab->Parent->GetHeight());
*/
}
void new_scroll_pos(void)
{
the_painttab->CurrentStylePos = ((CVSlider*)the_painttab->StyleSet.GetControlPtr(CTRL_STYLE_PAINT_SLIDER))->GetCurrentValue();
the_painttab->RequestUpdate();
}
//---------------------------------------------------------------
void PaintTab::UpdateTabInfo(void)
{
((CStaticText*)GetControlPtr(CTRL_PAINT_TEXT))->SetString1(mode_menu[PaintMode].ItemText);
}
//---------------------------------------------------------------
extern SLONG editor_texture_set;
void PaintTab::DrawTabContent(void)
{
EdRect bounds_rect,
content_rect;
content_rect = ContentRect;
content_rect.ShrinkRect(1,1);
content_rect.FillRect(CONTENT_COL);
SetWorkWindowBounds(ContentLeft()+1,ContentTop()+1,ContentWidth()-1,ContentHeight()-1);
DrawControlSet();
extern UWORD diff_page_count1,diff_page_count2;
{
CBYTE str[100];
sprintf(str,"diff tex(world %d) %d shared %d",editor_texture_set,diff_page_count1,diff_page_count2);
QuickText(0,0,str,0);
QuickText(1,0,str,WHITE_COL);
}
switch(PaintMode)
{
case PALETTE_PAINT:
UpdatePaletteInfo();
DrawPalette();
// DrawControlSet();
// PaintRect.HiliteRect(LOLITE_COL,HILITE_COL);
PaintRect.HiliteRect(LOLITE_COL,HILITE_COL);
break;
case INSTYLE_DEFINE:
case STYLE_DEFINE:
case PSX_TEX_DEFINE:
case ANIM_TMAP_PAINT:
case FLOOR_PAINT:
case TEXTURE_PAINT:
case PLANAR_PAINT:
UpdateTextureInfo();
DrawTexture();
// bounds_rect.SetRect(ContentLeft(),ContentTop(),ContentWidth(),ContentHeight());
// TextureSet.ControlSetBounds(&bounds_rect);
// TextureSet.DrawControlSet();
// PaintRect.HiliteRect(LOLITE_COL,HILITE_COL);
break;
case STYLE_PAINT:
DrawStyleTexture();
bounds_rect.SetRect(ContentLeft(),ContentTop(),ContentWidth(),ContentHeight());
StyleSet.ControlSetBounds(&bounds_rect);
StyleSet.DrawControlSet();
break;
default:
break;
}
//
// Default control set used by all
//
}
//---------------------------------------------------------------
void draw_selected_face_textures(SLONG tx,SLONG ty,SLONG zoom)
{
SLONG c0;
struct PrimFace4 *p_f4;
struct PrimFace3 *p_f3;
// zoom=1;
for(c0=1;c0<next_face_selected;c0++)
{
if(face_selected_list[c0]>0)
{
SLONG x1,y1,x2,y2,x3,y3,x4,y4;
p_f4=&prim_faces4[face_selected_list[c0]];
x1=((p_f4->UV[0][0]+tx)*zoom);
y1=((p_f4->UV[0][1]+ty)*zoom);
x2=((p_f4->UV[1][0]+tx)*zoom);
y2=((p_f4->UV[1][1]+ty)*zoom);
x3=((p_f4->UV[2][0]+tx)*zoom);
y3=((p_f4->UV[2][1]+ty)*zoom);
x4=((p_f4->UV[3][0]+tx)*zoom);
y4=((p_f4->UV[3][1]+ty)*zoom);
DrawLineC(x1,y1,x2,y2,WHITE_COL);
DrawLineC(x2,y2,x4,y4,WHITE_COL);
DrawLineC(x4,y4,x3,y3,WHITE_COL);
DrawLineC(x3,y3,x1,y1,WHITE_COL);
}
else
if(face_selected_list[c0]<0)
{
SLONG x1,y1,x2,y2,x3,y3;
p_f3=&prim_faces3[-face_selected_list[c0]];
x1=(p_f3->UV[0][0]+tx)*zoom;
y1=(p_f3->UV[0][1]+ty)*zoom;
x2=(p_f3->UV[1][0]+tx)*zoom;
y2=(p_f3->UV[1][1]+ty)*zoom;
x3=(p_f3->UV[2][0]+tx)*zoom;
y3=(p_f3->UV[2][1]+ty)*zoom;
DrawLineC(x1,y1,x2,y2,WHITE_COL);
DrawLineC(x2,y2,x3,y3,WHITE_COL);
DrawLineC(x3,y3,x1,y1,WHITE_COL);
}
}
}
extern void build_texture(SLONG x,SLONG y,SLONG w,SLONG h,UBYTE page,UBYTE u0,UBYTE v0,UBYTE u1,UBYTE v1,UBYTE u2,UBYTE v2,UBYTE u3,UBYTE v3);
void PaintTab::DrawAnimTmapSelector(void)
{
SLONG w,h,count;
EdRect tex_rect;
w=AnimRect.GetLeft();
count=ShowAnimTmap;
for(h=AnimRect.GetTop();(h<AnimRect.GetBottom())&&count<MAX_ANIM_TMAPS;h+=19)
{
if(CurrentAnimTmap==count)
{
tex_rect.SetRect(w-1,h-1,20,20);
tex_rect.OutlineRect(WHITE_COL);
// tex_rect.HiliteRect(HILITE_COL,LOLITE_COL);
}
tex_rect.SetRect(w,h,18,18);
// tex_rect.OutlineRect(WHITE_COL);
tex_rect.HiliteRect(HILITE_COL,LOLITE_COL);
if(anim_tmaps[count].Flags)
{
UWORD frame;
frame=anim_tmaps[count].Current;
build_texture(w+1,h+1,16,16,anim_tmaps[count].Page[frame],
anim_tmaps[count].UV[frame][0][0],anim_tmaps[count].UV[frame][0][1],
anim_tmaps[count].UV[frame][1][0],anim_tmaps[count].UV[frame][1][1],
anim_tmaps[count].UV[frame][2][0],anim_tmaps[count].UV[frame][2][1],
anim_tmaps[count].UV[frame][3][0],anim_tmaps[count].UV[frame][3][1]);
}
count++;
}
render_view(0);
}
void PaintTab::SelectStyle(MFPoint *clicked_point)
{
MFPoint local_point;
SLONG scroll_pos=CurrentStylePos;
SLONG c0,pos;
EdRect tex_rect;
SLONG tx=20,ty=20;
SLONG c1;
UBYTE UV[4][2];
local_point=*clicked_point;
GlobalToLocal(&local_point);
for(c0=0;c0<10;c0++)
{
tex_rect.SetRect(tx+25,ty+c0*26+30,230,24);
// LogText("MCD point x %d t %d , box x,y,w,h (%d,%d,%d,%d) \n",local_point.X,local_point.Y,tx+25,ty+c0*26+30,110,24);
if(tex_rect.PointInRect(&local_point))
{
LogText(" hit one \n");
//want to text edit the name
CurrentStyleEdit=c0+scroll_pos;
RequestUpdate();
tx=textures_xy[CurrentStyleEdit][0].Tx<<5;
ty=textures_xy[CurrentStyleEdit][0].Ty<<5;
CurrentTexturePage=textures_xy[CurrentStyleEdit][0].Page;
switch(textures_xy[CurrentStyleEdit][0].Flip)
{
case 0:
UV[0][0]=tx;
UV[0][1]=ty;
UV[1][0]=tx+31;
UV[1][1]=ty;
UV[2][0]=tx;
UV[2][1]=ty+31;
UV[3][0]=tx+31;
UV[3][1]=ty+31;
break;
case 1: //flip x
UV[0][0]=tx+31;
UV[0][1]=ty;
UV[1][0]=tx;
UV[1][1]=ty;
UV[2][0]=tx+31;
UV[2][1]=ty+31;
UV[3][0]=tx;
UV[3][1]=ty+31;
break;
case 2: //flip y
UV[0][0]=tx;
UV[0][1]=ty+31;
UV[1][0]=tx+31;
UV[1][1]=ty+31;
UV[2][0]=tx;
UV[2][1]=ty;
UV[3][0]=tx+31;
UV[3][1]=ty;
break;
case 3: //flip x+y
UV[0][0]=tx+31;
UV[0][1]=ty+31;
UV[1][0]=tx;
UV[1][1]=ty+31;
UV[2][0]=tx+31;
UV[2][1]=ty;
UV[3][0]=tx;
UV[3][1]=ty;
break;
}
for(c1=0;c1<4;c1++)
{
CurrentTexture.U[c1]=UV[c1][0];
CurrentTexture.V[c1]=UV[c1][1];
}
return;
}
}
}
extern UBYTE tmap2[];
extern void draw_quad_now(SLONG x,SLONG y,SLONG w,SLONG h,UBYTE tx,UBYTE ty,UBYTE page,UBYTE flip,UBYTE flags);
void PaintTab::DrawStyleTexture(void)
{
SLONG scroll_pos=CurrentStylePos;
SLONG c0,pos;
EdRect tex_rect;
SLONG tx=20,ty=20;
for(c0=0;c0<10;c0++)
{
if(CurrentStyleEdit==c0+scroll_pos)
{
tex_rect.SetRect(tx+25,ty+c0*26+30,110,24);
tex_rect.OutlineRect(0);
}
QuickTextC(tx+25,ty+c0*26+36,&texture_style_names[c0+scroll_pos][0],0);
draw_quad_now(tx+140,ty+c0*26+30-2,24,24,textures_xy[c0+scroll_pos][0].Tx<<5,textures_xy[c0+scroll_pos][0].Ty<<5,textures_xy[c0+scroll_pos][0].Page,textures_xy[c0+scroll_pos][0].Flip,textures_flags[c0+scroll_pos][0]);
draw_quad_now(tx+140+28,ty+c0*26+30-2,24,24,textures_xy[c0+scroll_pos][1].Tx<<5,textures_xy[c0+scroll_pos][1].Ty<<5,textures_xy[c0+scroll_pos][1].Page,textures_xy[c0+scroll_pos][1].Flip,textures_flags[c0+scroll_pos][1]);
draw_quad_now(tx+140+56,ty+c0*26+30-2,24,24,textures_xy[c0+scroll_pos][2].Tx<<5,textures_xy[c0+scroll_pos][2].Ty<<5,textures_xy[c0+scroll_pos][2].Page,textures_xy[c0+scroll_pos][2].Flip,textures_flags[c0+scroll_pos][2]);
}
// StyleControls.ControlSetBounds(GetContentRect());
// StyleControls.DrawControlSet();
}
void PaintTab::DrawTexture(void)
{
ULONG pixel;
SLONG c0,c1,
texture_x,
texture_y,
zoom;
SLONG x[4],y[4];
SetWorkWindowBounds(ContentLeft()+1,ContentTop()+1,ContentWidth()-1,ContentHeight()-1);
DrawAnimTmapSelector();
if(CurrentTexturePage>=0)
{
switch(WorkScreenDepth)
{
case 1:
{
/*
UBYTE *texture_ptr;
UBYTE *rect_ptr;
UBYTE *buffer_ptr;
UBYTE texture_buffer[256];
SET_TEXTURE_COORDS
rect_ptr = WorkWindow+PaintRect.GetLeft()+1+((PaintRect.GetTop()+1)*WorkScreenWidth);
if(Keys[KB_9])
texture_ptr = tmap2+texture_x+(texture_y*256);
else
texture_ptr = game_textures[CurrentTexturePage].TexturePtr+texture_x+(texture_y*256);
c0 = 256;
while(c0)
{
buffer_ptr = &texture_buffer[255];
c1 = 1<<TextureZoom;
while(c1)
{
pixel = texture_ptr[c1-1];
zoom = 256>>TextureZoom;
while(zoom--)
{
*(buffer_ptr--) = pixel;
}
c1--;
}
zoom = 256>>TextureZoom;
c0 -= zoom;
while(zoom)
{
memcpy(rect_ptr,texture_buffer,256);
rect_ptr += WorkScreenWidth;
zoom--;
}
texture_ptr += 256;
}
*/
}
break;
case 2:
/*
if (Keys[KB_8])
{
UBYTE *texture_ptr;
UWORD *rect_ptr;
UWORD *buffer_ptr;
UWORD texture_buffer[256];
SET_TEXTURE_COORDS
rect_ptr = ((UWORD*)WorkWindow)+PaintRect.GetLeft()+1+((PaintRect.GetTop()+1)*WorkScreenPixelWidth);
if(Keys[KB_9])
texture_ptr = tmap2+texture_x+(texture_y*256);
else
texture_ptr = game_textures[CurrentTexturePage].TexturePtr+texture_x+(texture_y*256);
c0 = 256;
while(c0)
{
buffer_ptr = &texture_buffer[255];
c1 = 1<<TextureZoom;
while(c1)
{
extern UWORD pal_to_16[];
extern UWORD yc_to_555[8][256*64];
pixel = yc_to_555[CurrentTexturePage][texture_ptr[c1-1]+(256*32)];
zoom = 256>>TextureZoom;
while(zoom--)
{
*(buffer_ptr--) = pixel;
}
c1--;
}
zoom = 256>>TextureZoom;
c0 -= zoom;
while(zoom)
{
memcpy(rect_ptr,texture_buffer,256*2);
rect_ptr += WorkScreenPixelWidth;
zoom--;
}
texture_ptr += 256;
}
}
else
*/
{
//
// Ugh! Whats this!!!
//
SET_TEXTURE_COORDS
UWORD *rect_ptr = ((UWORD*)WorkWindow)+PaintRect.GetLeft()+1+((PaintRect.GetTop()+1)*WorkScreenPixelWidth);
UWORD *text_ptr = game_textures[CurrentTexturePage].TexturePtr;
SLONG i;
SLONG j;
SLONG zoom = 256 >> TextureZoom;
SLONG unzoom = 8 - TextureZoom;
if (zoom == 1)
{
for (i = 0; i < 256; i++)
{
memcpy(rect_ptr, text_ptr, 512);
text_ptr += 256;
rect_ptr += WorkScreenPixelWidth;
}
if(show_info)
if(CurrentTexturePage<8)
{
CBYTE str[100];
SLONG x,y,page;
page=CurrentTexturePage*64;
extern UWORD page_count[];
for(y=0;y<8;y++)
for(x=0;x<8;x++)
{
//sprintf(str,"%d",page_count[page]);
sprintf(str,"%d(%d)",page_count[page],page);
QuickText(PaintRect.GetLeft()+x*32,PaintRect.GetTop()+y*32,str,0);
QuickText(PaintRect.GetLeft()+x*32+1,PaintRect.GetTop()+y*32+1,str,WHITE_COL);
if(page_remap[page])
{
SLONG u,v,flip=0;
UWORD rpage;
rpage=page_remap[page]-1;
u=(rpage&7)<<5;
v=((rpage>>3)&7)<<5;
if(rpage&(1<<14))
flip=1;
if(rpage&(1<<15))
flip|=2;
draw_quad_now(PaintRect.GetLeft()+x*32+16,PaintRect.GetTop()+y*32+16,16,16,u,v,((rpage>>6)&7)+25,flip,POLY_T);
}
page++;
}
}
}
else
{
for (i = 0; i < 256; i++)
for (j = 0; j < 256; j++)
{
rect_ptr[i + j * WorkScreenPixelWidth] = text_ptr[((i >> unzoom) + texture_x) + ((j >> unzoom) + texture_y) * 256];
}
if(show_info)
if(CurrentTexturePage<8)
{
CBYTE str[100];
SLONG x,y,page;
page=CurrentTexturePage*64;
extern UWORD page_count[];
for(y=0;y<8;y++)
for(x=0;x<8;x++)
{
SLONG zoom_x,zoom_y;
zoom_x=((x*32)<<unzoom)-(texture_x<<unzoom);
zoom_y=((y*32)<<unzoom)-(texture_y<<unzoom);
if(zoom_x>=0&&zoom_x<246&&zoom_y>=0&&zoom_y<246)
{
sprintf(str,"%d(%d)",page_count[page],page);
QuickText(PaintRect.GetLeft()+zoom_x,PaintRect.GetTop()+zoom_y,str,0);
QuickText(PaintRect.GetLeft()+zoom_x+1,PaintRect.GetTop()+zoom_y+1,str,WHITE_COL);
if(page_remap[page])
{
SLONG u,v,flip=0;
UWORD rpage;
rpage=page_remap[page]-1;
u=(rpage&7)<<5;
v=((rpage>>3)&7)<<5;
if(rpage&(1<<14))
flip=1;
if(rpage&(1<<15))
flip|=2;
draw_quad_now(PaintRect.GetLeft()+zoom_x+(16<<unzoom),PaintRect.GetTop()+zoom_y+(16<<unzoom),16<<unzoom,16<<unzoom,u,v,((rpage>>6)&7)+25,flip,POLY_T);
}
}
page++;
}
}
}
}
break;
}
//show fade table
/*
{
SLONG x,y;
for(y=0;y<64;y++)
{
memcpy(rect_ptr,&fade_tables[y<<8],256);
rect_ptr += WorkScreenWidth;
memcpy(rect_ptr,&fade_tables[y<<8],256);
rect_ptr += WorkScreenWidth;
memcpy(rect_ptr,&fade_tables[y<<8],256);
rect_ptr += WorkScreenWidth;
memcpy(rect_ptr,&fade_tables[y<<8],256);
rect_ptr += WorkScreenWidth;
}
}
*/
if(TextureFlags&FLAGS_SHOW_TEXTURE)
{
SetWorkWindowBounds (
ContentLeft()+PaintRect.GetLeft()+2,
ContentTop()+PaintRect.GetTop()+2,
256,
256
);
SetWorkWindowBounds (
ContentLeft()+PaintRect.GetLeft()+2,
ContentTop()+PaintRect.GetTop()+2,
256,
256
);
zoom = 256>>TextureZoom;
for(c0=0;c0<4;c0++)
{
x[c0] = (CurrentTexture.U[c0]-texture_x)*zoom;
y[c0] = (CurrentTexture.V[c0]-texture_y)*zoom;
}
DrawLineC(x[0],y[0],x[1],y[1],WHITE_COL);
DrawLineC(x[2],y[2],x[0],y[0],WHITE_COL);
if(TextureFlags&FLAGS_QUADS)
{
DrawLineC(x[1],y[1],x[3],y[3],WHITE_COL);
DrawLineC(x[3],y[3],x[2],y[2],WHITE_COL);
}
else
DrawLineC(x[1],y[1],x[2],y[2],WHITE_COL);
// if(!(TextureFlags&FLAGS_FIXED))
{
if(TextureFlags&FLAGS_QUADS)
for(c0=0;c0<4;c0++)
{
ClickRect[c0].SetRect(x[c0]-3,y[c0]-3,7,7);
ClickRect[c0].OutlineRect(WHITE_COL);
// ClickRect[c0].HiliteRect(HILITE_COL,LOLITE_COL);
}
else
for(c0=0;c0<3;c0++)
{
ClickRect[c0].SetRect(x[c0]-3,y[c0]-3,7,7);
ClickRect[c0].OutlineRect(WHITE_COL);
// ClickRect[c0].HiliteRect(HILITE_COL,LOLITE_COL);
}
}
if(next_face_selected)
draw_selected_face_textures(-texture_x,-texture_y,zoom);
// draw_selected_face_textures(-texture_x+((PaintRect.GetLeft()+2)),-texture_y+((PaintRect.GetTop()+2)),zoom);
}
}
}
//---------------------------------------------------------------
void PaintTab::UpdateTexture(void)
{
if(LockWorkScreen())
{
DrawTexture();
UnlockWorkScreen();
}
ShowWorkWindow(0);
}
//---------------------------------------------------------------
UBYTE bit_tab[10] = { 0,1,2,3,4,4,4,4,4,4 };
void PaintTab::UpdateTextureInfo(void)
{
CBYTE str[20];
if(CurrentTexturePage>=0)
((CStaticText*)GetControlPtr(CTRL_TEX_PAGE_TEXT))->SetString1(texture_menu[CurrentTexturePage].ItemText);
// ((CStaticText*)TextureSet.GetControlPtr(CTRL_TEX_PAGE_TEXT))->SetString1(texture_menu[CurrentTexturePage].ItemText);
sprintf(str,"%d x %d",TextureWidth,TextureHeight);
((CStaticText*)GetControlPtr(CTRL_TEX_SIZE_TEXT))->SetString1(str);
//md ((CStaticText*)TextureSet.GetControlPtr(CTRL_TEX_SIZE_TEXT))->SetString1(str);
// ((CStaticText*)GetControlPtr(CTRL_TEX_SIZE_TEXT))->SetString1(texture_size[bit_tab[TextureSize>>4]].ItemText);
// TextureSet.SetControlState(CTRL_TEX_NO_LIGHT,(edit_info.FlatShade ? CTRL_SELECTED : CTRL_DESELECTED));
SetControlState(CTRL_TEX_NO_HIDDEN,(edit_info.NoHidden ? CTRL_SELECTED : CTRL_DESELECTED));
SetControlState(CTRL_TEX_USE_CLIPPED,(edit_info.Clipped&2 ? CTRL_SELECTED : CTRL_DESELECTED));
SetControlState(CTRL_TEX_ROOF_TEX,(edit_info.RoofTex ? CTRL_SELECTED : CTRL_DESELECTED));
SetControlState(CTRL_TEX_SELECT_DRAWN,(SelectDrawn ? CTRL_SELECTED : CTRL_DESELECTED));
SetControlState(CTRL_TEX_QUAD_BOX,(TextureFlags&FLAGS_QUADS ? CTRL_SELECTED : CTRL_DESELECTED));
SetControlState(CTRL_TEX_FIXED_BOX,(TextureFlags&FLAGS_FIXED ? CTRL_SELECTED : CTRL_DESELECTED));
// TextureSet.SetControlState(CTRL_TEX_SIZE_MENUW,(TextureFlags&FLAGS_FIXED ? CTRL_ACTIVE : CTRL_INACTIVE));
// TextureSet.SetControlState(CTRL_TEX_SIZE_MENUH,(TextureFlags&FLAGS_FIXED ? CTRL_ACTIVE : CTRL_INACTIVE));
if(SelectFlag==5)
SetControlState(CTRL_TEX_PLANAR_MAP,(CTRL_SELECTED ));
else
SetControlState(CTRL_TEX_PLANAR_MAP,(CTRL_DESELECTED ));
if(SelectFlag==6)
SetControlState(CTRL_TEX_PLANAR_MAPF,(CTRL_SELECTED ));
else
SetControlState(CTRL_TEX_PLANAR_MAPF,(CTRL_DESELECTED ));
}
//---------------------------------------------------------------
void PaintTab::DrawPalette(void)
{
ULONG c0,c1,
colour,
*rect_ptr,
*temp_ptr;
EdRect colour_rect;
LogText(" draw pal currentcol %d \n",CurrentColour);
SetWorkWindowBounds(ContentLeft()+1,ContentTop()+1,ContentWidth()-1,ContentHeight()-1);
rect_ptr = (ULONG*)(WorkWindow+PaintRect.GetLeft()*2+2+((PaintRect.GetTop()+1)*WorkScreenWidth));
for(c0=0;c0<256;c0++)
{
colour = pal_to_16[c0]*0x00010001;
temp_ptr = rect_ptr+((c0&0x0f)<<3)+(((c0&0xff0)>>2)*WorkScreenWidth);
for(c1=0;c1<16;c1++,temp_ptr+=(WorkScreenWidth>>2))
{
*(temp_ptr+0) = colour;
*(temp_ptr+1) = colour;
*(temp_ptr+2) = colour;
*(temp_ptr+3) = colour;
*(temp_ptr+4) = colour;
*(temp_ptr+5) = colour;
*(temp_ptr+6) = colour;
*(temp_ptr+7) = colour;
}
}
colour_rect.SetRect (
(PaintRect.GetLeft()+1)+((CurrentColour&0x0f)<<4),
(PaintRect.GetTop()+1)+(CurrentColour&0xf0),
16,
16
);
colour_rect.OutlineRect(WHITE_COL);
}
//---------------------------------------------------------------
void PaintTab::UpdatePalette(void)
{
if(LockWorkScreen())
{
DrawPalette();
UnlockWorkScreen();
}
ShowWorkWindow(0);
}
//---------------------------------------------------------------
void PaintTab::UpdatePaletteInfo(void)
{
}
//---------------------------------------------------------------
void PaintTab::do_undo_me_bloody_self_then(SLONG index)
{
struct GenericUndo *p_u;
SLONG c0;
if(index<0)
p_u=&MyUndo.undo_undo_info[-index];
else
p_u=&MyUndo.undo_info[index];
switch(p_u->Type)
{
case UNDO_MOVE_TEXTURE:
p_u->Type=0;
MyUndo.MoveTexture(index<0?0:1,CurrentTexturePage,0,CurrentTexture.U[0],CurrentTexture.V[0],CurrentTexture.U[1],CurrentTexture.V[1],
CurrentTexture.U[2],CurrentTexture.V[2],CurrentTexture.U[3],CurrentTexture.V[3]);
CurrentTexturePage=p_u->Texture.Page;
CurrentTexture.U[0]=p_u->Texture.U[0];
CurrentTexture.U[1]=p_u->Texture.U[1];
CurrentTexture.U[2]=p_u->Texture.U[2];
CurrentTexture.U[3]=p_u->Texture.U[3];
CurrentTexture.V[0]=p_u->Texture.V[0];
CurrentTexture.V[1]=p_u->Texture.V[1];
CurrentTexture.V[2]=p_u->Texture.V[2];
CurrentTexture.V[3]=p_u->Texture.V[3];
// if(selected_face.Face)
if(selected_face.PEle)
{
if(selected_face.PEle==(struct EditMapElement*)-2)
{
}
else
if(selected_face.PEle==(struct EditMapElement*)-1)
{
if(selected_face.Face<0)
{
prim_faces3[-selected_face.Face].TexturePage = (UWORD)CurrentTexturePage;
for(c0=0;c0<3;c0++)
{
prim_faces3[-selected_face.Face].UV[c0][0] = CurrentTexture.U[c0];
prim_faces3[-selected_face.Face].UV[c0][1] = CurrentTexture.V[c0];
}
}
else
{
prim_faces4[selected_face.Face].TexturePage = (UWORD)CurrentTexturePage;
for(c0=0;c0<4;c0++)
{
prim_faces4[selected_face.Face].UV[c0][0] = CurrentTexture.U[c0];
prim_faces4[selected_face.Face].UV[c0][1] = CurrentTexture.V[c0];
}
}
}
if(LockWorkScreen())
{
Parent->DrawContent();
UnlockWorkScreen();
ShowWorkWindow(0);
}
}
break;
}
}
void PaintTab::CutFloorBrush(BuildTab *BuildMode,MFPoint *current_point)
{
MFPoint point1,point2;
SLONG con_top,con_left;
SLONG x,y,w,h;
SLONG mx1,my1,mz1;
SLONG mx2,my2,mz2;
x=Parent->ContentLeft();
y=Parent->ContentTop();
w=Parent->ContentWidth();
h=Parent->ContentHeight();
point1.X = MouseX;
point1.Y = MouseY;
Parent->GlobalToLocal(&point1);
BuildMode->CalcMapCoord(&mx1,&my1,&mz1,x,y,w,h,&point1);
// point1 = *clicked_point;
while(SHELL_ACTIVE && LeftButton)
{
engine_keys_scroll();
engine_keys_spin();
engine_keys_zoom();
point2.X = MouseX;//-con_left;
point2.Y = MouseY;//-con_top;
Parent->GlobalToLocal(&point2);
BuildMode->CalcMapCoord(&mx2,&my2,&mz2,x,y,w,h,&point2);
if(LockWorkScreen())
{
Parent->DrawContent();
Parent->DrawGrowBox();
BuildMode->Texture=2;
BuildMode->DrawContentRect(mx1,mz1,mx2,mz2,WHITE_COL);
BuildMode->Texture=0;
UnlockWorkScreen();
}
ShowWorkWindow(0);
}
{
SLONG mw,mh;
mw=mx2-mx1;
if(mw<0)
{
mw=-mw;
mx1=mx2;
}
mh=mz2-mz1;
if(mh<0)
{
mh=-mh;
mz1=mz2;
}
CutMapBlock.Cut(mx1>>ELE_SHIFT,mz1>>ELE_SHIFT,mw>>ELE_SHIFT,mh>>ELE_SHIFT,0);
SubMode=FLOOR_PASTE_BRUSH;
}
RequestUpdate();
}
void PaintTab::HandleTab(MFPoint *current_point)
{
ULONG control_id;
SLONG update = 0;
// ModeTab::HandleTab(current_point);
if(PaintMode==PALETTE_PAINT)
PaletteSet.HandleControlSet(current_point);
else
if(PaintMode==STYLE_PAINT)
StyleSet.HandleControlSet(current_point);
else
HandleControlSet(current_point);
if(PaintMode==ANIM_TMAP_PAINT)
{
if(CurrentTexturePage<0)
CurrentTexturePage=0;
}
if(PaintMode==FLOOR_PAINT)
{
if(Keys[KB_B])
{
SubMode=FLOOR_CUT_BRUSH;
SubStatus=0;
}
}
if(Keys[KB_U])
{
SLONG index;
Keys[KB_U]=0;
index=MyUndo.DoUndo(ShiftFlag?1:0);
if(index)
do_undo_me_bloody_self_then(index);
update = 1;
}
if(Keys[KB_PMINUS])
{
if(TextureZoom<8)
{
TextureZoom++;
update = 1;
}
}
else if(Keys[KB_PPLUS])
{
if(TextureZoom>0)
{
TextureZoom--;
update = 1;
}
}
if(Keys[KB_P4])
{
if(TextureX>0)
{
TextureX--;
update = 1;
}
}
else if(Keys[KB_P6])
{
if(TextureX<(256-(1<<TextureZoom)))
{
TextureX++;
update = 1;
}
}
if(Keys[KB_P8])
{
if(TextureY>0)
{
TextureY--;
update = 1;
}
}
else if(Keys[KB_P2])
{
if(TextureY<(256-(1<<TextureZoom)))
{
TextureY++;
update = 1;
}
}
if(Keys[KB_K])
{
SLONG scale= 260;
if(ShiftFlag)
scale+=20;
scale_selected_tmaps(scale);
// edit_info.TileScale+=5;
Keys[KB_K]=0;
update=1;
}
if(Keys[KB_L])
{
SLONG scale= 250;
if(ShiftFlag)
scale-=20;
scale_selected_tmaps(scale);
// edit_info.TileScale-=5;
// if(edit_info.TileScale<0)
// edit_info.TileScale=0;
Keys[KB_L]=0;
update=1;
}
void offset_selected_tex_page(SWORD offset);
if(Keys[KB_PLUS])
{
SLONG offset=1;
Keys[KB_PLUS]=0;
if(ShiftFlag)
offset=64;
offset_selected_tex_page(offset);
}
if(Keys[KB_MINUS])
{
SLONG offset=-1;
Keys[KB_MINUS]=0;
if(ShiftFlag)
offset=-64;
offset_selected_tex_page(offset);
}
if(LastKey==KB_P&&(!ShiftFlag))
{
LastKey=0;
SelectFlag=5;
SetPaintMode(PLANAR_PAINT);
update=1;
// DrawTabContent();
}
if(!ControlFlag)
{
SLONG offset=0;
if(ShiftFlag)
offset=10;
if(Keys[KB_1])
{
CurrentTexturePage = 0+offset;
update=1;
}
if(Keys[KB_2])
{
CurrentTexturePage = 1+offset;
update=1;
}
if(Keys[KB_3])
{
CurrentTexturePage = 2+offset;
update=1;
}
if(Keys[KB_4])
{
CurrentTexturePage = 3+offset;
update=1;
}
if(Keys[KB_5])
{
CurrentTexturePage = 4+offset;
update=1;
}
if(Keys[KB_6])
{
CurrentTexturePage = 5+offset;
update=1;
}
if(Keys[KB_7])
{
CurrentTexturePage = 6+offset;
update=1;
}
if(Keys[KB_8])
{
CurrentTexturePage = 7+offset;
update=1;
}
if(Keys[KB_9])
{
CurrentTexturePage = 8+offset;
update=1;
}
//not yet needed
if(Keys[KB_0])
{
CurrentTexturePage = 9+offset;
update=1;
}
if(update)
if(CurrentTexturePage>20)
CurrentTexturePage=20;
if(LastKey)
{
control_id = HandleControlSetKey(LastKey);
if(control_id)
{
HandleControl(control_id);
LastKey = 0;
}
else
{
if(PaintMode==PALETTE_PAINT)
{
if(LastKey==KB_LBRACE)
{
CurrentColour = (CurrentColour-1)&0xff;
update = 1;
LastKey = 0;
}
else if(LastKey==KB_RBRACE)
{
CurrentColour = (CurrentColour+1)&0xff;
update = 1;
LastKey = 0;
}
else
{
control_id = PaletteSet.HandleControlSetKey(LastKey);
if(control_id)
{
HandlePaletteControl(control_id);
LastKey = 0;
}
}
}
else
if(PaintMode==STYLE_PAINT)
{
if(LastKey==KB_LBRACE)
{
update = 1;
LastKey = 0;
}
else if(LastKey==KB_RBRACE)
{
update = 1;
LastKey = 0;
}
else
{
control_id = StyleSet.HandleControlSetKey(LastKey);
if(control_id)
{
HandleStyleControl(control_id);
LastKey = 0;
}
}
}
else
{
control_id = HandleControlSetKey(LastKey); //ts
if(control_id)
{
HandleTextureControl(control_id);
LastKey = 0;
}
}
}
}
/*
if(Keys[KB_F])
{
Keys[KB_F]=0;
TextureFlags ^= FLAGS_FIXED;
if(TextureFlags & FLAGS_FIXED)
SetControlState(CTRL_TEX_FIXED_BOX,CTRL_SELECTED);
else
SetControlState(CTRL_TEX_FIXED_BOX,CTRL_DESELECTED);
if(LockWorkScreen())
{
DrawControlSet();
// DrawTabContent();
UnlockWorkScreen();
}
ShowWorkWindow(0);
UpdateTexture();
return;
}
*/
}
if(update)
{
if(PaintMode==PALETTE_PAINT)
UpdatePalette();
else
UpdateTexture();
}
}
//---------------------------------------------------------------
#define DRAG_NORMAL 0
#define DRAG_SHIFT 1
#define DRAG_SHIFT_H 2
#define DRAG_SHIFT_V 3
#define DRAG_CONTROL 4
ULONG hooks[4][2] =
{
{ 2,1 },
{ 3,0 },
{ 0,3 },
{ 1,2 }
};
void PaintTab::SelectAnimTexture(MFPoint *clicked_point)
{
SLONG x,y;
x=clicked_point->X-AnimRect.GetLeft();
y=clicked_point->Y-AnimRect.GetTop();
y=(y/19)+ShowAnimTmap;
if(PaintMode==ANIM_TMAP_PAINT)
{
}
else
{
CurrentTexturePage=-y;
RequestUpdate();
}
}
void PaintTab::SetEditAnimTexture(MFPoint *clicked_point)
{
SLONG x,y;
x=clicked_point->X-AnimRect.GetLeft();
y=clicked_point->Y-AnimRect.GetTop();
y=(y/19)+ShowAnimTmap;
if(PaintMode==ANIM_TMAP_PAINT)
{
}
else
{
SetPaintMode(ANIM_TMAP_PAINT);
// PaintMode=ANIM_TMAP_PAINT;
CurrentTexturePage=0;
CurrentAnimTmap=y;
RequestUpdate();
}
}
UWORD PaintTab::HandleTabClick(UBYTE flags,MFPoint *clicked_point)
{
ULONG control_id;
SLONG zoom;
Control *current_control;
MFPoint current_point,
local_point;
switch(flags)
{
case NO_CLICK:
break;
case LEFT_CLICK:
SetWorkWindowBounds(ContentLeft()+1,ContentTop()+1,ContentWidth()-1,ContentHeight()-1);
local_point = *clicked_point;
GlobalToLocal(&local_point);
if(AnimRect.PointInRect(&local_point)&&RightButton==0&&PaintMode!=STYLE_PAINT)
{
SelectAnimTexture(&local_point);
UpdateTexture();
}
else
if( (PaintRect.PointInRect(&local_point)) && (RightButton==0) && (PaintMode!=STYLE_PAINT) )
{
if(PaintMode==FLOOR_PAINT||PaintMode==TEXTURE_PAINT||PaintMode==ANIM_TMAP_PAINT||PaintMode==STYLE_DEFINE||PaintMode==PSX_TEX_DEFINE||PaintMode==INSTYLE_DEFINE)
{
SelectTexture(clicked_point);
SubMode=0;
}
else
if(PaintMode==PALETTE_PAINT)
SelectColour(clicked_point);
else
if(PaintMode==PLANAR_PAINT)
PlanarMapping(clicked_point);
}
else
{
if(PaintMode==STYLE_PAINT)
{
SelectStyle(clicked_point);
}
local_point = *clicked_point;
GlobalToLocal(&local_point);
/*
control_id = HandleControlSetClick(flags,&local_point);
HandleControl(control_id);
*/
current_control = GetControlList();//ts
while(current_control)
{
if(!(current_control->GetFlags()&CONTROL_INACTIVE) && current_control->PointInControl(&local_point))
{
// Handle control.
control_id = current_control->TrackControl(&local_point);
HandleControl(control_id);
// Tidy up display.
if(LockWorkScreen())
{
DrawTab();
UnlockWorkScreen();
}
ShowWorkWindow(0);
return control_id;
}
current_control = current_control->GetNextControl();
}
/*
if(control_id)
{
return control_id;
}
else
*/
{
if(PaintMode==PALETTE_PAINT)
{
control_id = PaletteSet.HandleControlSetClick(flags,clicked_point);
HandlePaletteControl(control_id);
}
else
if(PaintMode==STYLE_PAINT)
{
control_id = StyleSet.HandleControlSetClick(flags,clicked_point);
HandleStyleControl(control_id);
}
else
{
control_id = HandleControlSetClick(flags,clicked_point); //ts
HandleTextureControl(control_id);
}
}
}
break;
case RIGHT_CLICK:
SetWorkWindowBounds(ContentLeft()+1,ContentTop()+1,ContentWidth()-1,ContentHeight()-1);
local_point = *clicked_point;
GlobalToLocal(&local_point);
if(PaintMode==STYLE_PAINT)
{
}
else
if(AnimRect.PointInRect(&local_point))
{
SetEditAnimTexture(&local_point);
UpdateTexture();
}
else
if(PaintRect.PointInRect(&local_point))
{
zoom = 0;
SubMode=0;
while(SHELL_ACTIVE && RightButton)
{
current_point.X = MouseX;
current_point.Y = MouseY;
GlobalToLocal(&current_point);
if(current_point.X!=local_point.X || current_point.Y!=local_point.Y)
{
if(LeftButton)
{
zoom += local_point.Y-current_point.Y;
if((zoom/4))
{
TextureZoom += zoom/4;
zoom = 0;
}
if(TextureZoom<0)
TextureZoom = 0;
else if(TextureZoom>8)
TextureZoom = 8;
}
else
{
TextureX += local_point.X-current_point.X;
TextureY += local_point.Y-current_point.Y;
if(TextureX<0)
TextureX = 0;
else if(TextureX>(256-(1<<TextureZoom)))
TextureX = (256-(1<<TextureZoom));
if(TextureY<0)
TextureY = 0;
else if(TextureY>(256-(1<<TextureZoom)))
TextureY = (256-(1<<TextureZoom));
}
UpdateTexture();
local_point = current_point;
}
}
}
break;
}
return 0;
}
//---------------------------------------------------------------
void PaintTab::HandleControl(UWORD control_id)
{
switch(control_id&0xff)
{
case CTRL_TEX_TILE_SIZE:
edit_info.TileScale = ((CHSlider*)GetControlPtr(CTRL_TEX_TILE_SIZE))->GetCurrentValue(); //ts
RequestUpdate();
break;
case CTRL_PAINT_MENU:
PaintMode = (control_id>>8)-1;
RequestUpdate();
break;
case CTRL_PAINT_TEXT:
break;
case CTRL_TEX_PAGE_TEXT:
break;
case CTRL_TEX_PAGE_MENU:
CurrentTexturePage = (control_id>>8)-1;
if(CurrentTexturePage>max_textures)
{
CurrentTexturePage=max_textures;
}
break;
case CTRL_TEX_HIDE_L:
if(edit_info.HideMap&1)
{
edit_info.HideMap&=~1;
SetControlState(CTRL_TEX_HIDE_L,CTRL_DESELECTED);
}
else
{
SetControlState(CTRL_TEX_HIDE_L,CTRL_SELECTED);
edit_info.HideMap|=1;
}
break;
case CTRL_TEX_HIDE_R:
if(edit_info.HideMap&2)
{
edit_info.HideMap&=~2;
SetControlState(CTRL_TEX_HIDE_R,CTRL_DESELECTED);
}
else
{
SetControlState(CTRL_TEX_HIDE_R,CTRL_SELECTED);
edit_info.HideMap|=2;
}
break;
case CTRL_TEX_INFO:
show_info^=1;
break;
case CTRL_TEX_CLEAR:
{
Alert rus;
if(rus.HandleAlert("Remove painted textures?",NULL)==1)
{
remove_painted_textures();
}
if(rus.HandleAlert("Remove style textures?",NULL)==1)
{
remove_style_textures();
}
}
break;
case CTRL_BUILD_OTHER:
extern SLONG build_psx;
build_psx^=1;
create_city(BUILD_MODE_EDITOR);
break;
case CTRL_TEX_HIDE_ROOF:
if(edit_info.HideMap&4)
{
edit_info.HideMap&=~4;
SetControlState(CTRL_TEX_HIDE_ROOF,CTRL_DESELECTED);
}
else
{
SetControlState(CTRL_TEX_HIDE_ROOF,CTRL_SELECTED);
edit_info.HideMap|=4;
}
break;
case CTRL_TEX_QUAD_BOX:
// ToggleControlSelectedState(CTRL_TEX_QUAD_BOX);
TextureFlags ^= FLAGS_QUADS;
break;
case CTRL_TEX_FIXED_BOX:
// ToggleControlSelectedState(CTRL_TEX_FIXED_BOX);
TextureFlags ^= FLAGS_FIXED;
// ToggleControlActiveState(CTRL_TEX_SIZE_MENU);
break;
/*
case CTRL_TEX_SIZE_MENUW:
// TextureWidth = 1<<((control_id>>8)+2);
TextureWidth = 32; //texture_sizes[(control_id>>8)-1];
break;
case CTRL_TEX_SIZE_MENUH:
// TextureHeight = 1<<((control_id>>8)+2);
TextureHeight = 32;//texture_sizes[(control_id>>8)-1];
break;
*/
case CTRL_TEX_SIZE_TEXT:
break;
case CTRL_TEX_IMPORT_TEX:
{
FileRequester *fr;
CBYTE fname[100];
fr=new FileRequester("data\\","*.tex","Save A Prim","temp.tex");
if(fr->Draw())
{
strcpy(fname,fr->Path);
strcat(fname,fr->FileName);
import_tex(fname);
}
delete fr;
RequestUpdate();
}
break;
case CTRL_TEX_LOAD_ANIMTMAP:
load_animtmaps();
break;
case CTRL_TEX_SAVE_ANIMTMAP:
save_animtmaps();
break;
case CTRL_TEX_ANIMTMAP_UP:
if(ShowAnimTmap>1)
{
ShowAnimTmap--;
RequestUpdate();
}
break;
case CTRL_TEX_ANIMTMAP_DOWN:
if(ShowAnimTmap<64)
{
ShowAnimTmap++;
RequestUpdate();
}
break;
case CTRL_TEX_PLANAR_MAP:
DoPlanarMap();
break;
case CTRL_TEX_PLANAR_MAPF:
DoPlanarMapF();
break;
case CTRL_TEX_SELECT_DRAWN:
SelectDrawn ^= 1;
break;
// case CTRL_TEX_NO_LIGHT:
// edit_info.FlatShade^=1;
// break;
case CTRL_TEX_NO_HIDDEN:
edit_info.NoHidden^=1;
break;
case CTRL_TEX_ROOF_TEX:
edit_info.RoofTex^=1;
break;
case CTRL_TEX_USE_CLIPPED:
edit_info.Clipped^=2;
break;
case CTRL_TEX_SET_CLIPPED:
extern void find_map_clip(SLONG *minx,SLONG *maxx,SLONG *minz,SLONG *maxz);
{
SLONG minx,maxx,minz,maxz;
find_map_clip(&minx,&maxx,&minz,&maxz);
edit_info.MinX=minx;
edit_info.MinZ=minz;
edit_info.MaxX=maxx;
edit_info.MaxZ=maxz;
edit_info.Clipped=2;
}
break;
}
UpdateTextureInfo();
UpdateTabInfo();
// Tidy up display.
if(LockWorkScreen())
{
DrawTab();
UnlockWorkScreen();
}
ShowWorkWindow(0);
}
//---------------------------------------------------------------
void PaintTab::HandlePaletteControl(UWORD control_id)
{
UpdatePaletteInfo();
// Tidy up display.
if(LockWorkScreen())
{
DrawTab();
UnlockWorkScreen();
}
ShowWorkWindow(0);
}
void PaintTab::HandleStyleControl(UWORD control_id)
{
switch(control_id&0xff)
{
case CTRL_STYLE_PAINT_SLIDER:
new_scroll_pos();
// RequestUpdate();
break;
}
// Tidy up display.
if(LockWorkScreen())
{
DrawTab();
UnlockWorkScreen();
}
ShowWorkWindow(0);
}
void PaintTab::DoPlanarMap(void)
{
if(LockWorkScreen())
{
if(SelectFlag==5)
{
SetControlState(CTRL_TEX_PLANAR_MAP,(CTRL_DESELECTED )); //ts
SetControlState(CTRL_TEX_PLANAR_MAPF,(CTRL_DESELECTED ));
SelectFlag=0;
}
else
if(SelectFlag==6)
{
SetControlState(CTRL_TEX_PLANAR_MAP,(CTRL_SELECTED ));
SetControlState(CTRL_TEX_PLANAR_MAPF,(CTRL_DESELECTED ));
SelectFlag=5;
}
else
{
SetControlState(CTRL_TEX_PLANAR_MAP,(CTRL_SELECTED ));
SetControlState(CTRL_TEX_PLANAR_MAPF,(CTRL_DESELECTED ));
SelectFlag=5;
}
Parent->DrawContent();
UnlockWorkScreen();
ShowWorkWindow(0);
}
ShowWorkWindow(0);
RequestUpdate();
}
void PaintTab::DoPlanarMapF(void)
{
if(LockWorkScreen())
{
if(SelectFlag==6)
{
SetControlState(CTRL_TEX_PLANAR_MAP,(CTRL_DESELECTED ));
SetControlState(CTRL_TEX_PLANAR_MAPF,(CTRL_DESELECTED ));
SelectFlag=0;
}
else
if(SelectFlag==5)
{
SetControlState(CTRL_TEX_PLANAR_MAP,(CTRL_DESELECTED ));
SetControlState(CTRL_TEX_PLANAR_MAPF,(CTRL_SELECTED ));
SelectFlag=6;
}
else
{
SetControlState(CTRL_TEX_PLANAR_MAP,(CTRL_DESELECTED ));
SetControlState(CTRL_TEX_PLANAR_MAPF,(CTRL_SELECTED ));
SelectFlag=6;
}
Parent->DrawContent();
UnlockWorkScreen();
ShowWorkWindow(0);
}
ShowWorkWindow(0);
RequestUpdate();
}
//---------------------------------------------------------------
void PaintTab::HandleTextureControl(UWORD control_id)
{
switch(control_id&0xff)
{
case CTRL_TEX_PAGE_TEXT:
break;
case CTRL_TEX_PAGE_MENU:
CurrentTexturePage = (control_id>>8)-1;
if(CurrentTexturePage>max_textures)
{
CurrentTexturePage=max_textures;
}
break;
case CTRL_TEX_QUAD_BOX:
// ToggleControlSelectedState(CTRL_TEX_QUAD_BOX);
TextureFlags ^= FLAGS_QUADS;
break;
case CTRL_TEX_FIXED_BOX:
// ToggleControlSelectedState(CTRL_TEX_FIXED_BOX);
TextureFlags ^= FLAGS_FIXED;
// ToggleControlActiveState(CTRL_TEX_SIZE_MENU);
break;
/*
case CTRL_TEX_SIZE_MENUW:
// TextureWidth = 1<<((control_id>>8)+2);
TextureWidth = 32; //texture_sizes[(control_id>>8)-1];
break;
case CTRL_TEX_SIZE_MENUH:
// TextureHeight = 1<<((control_id>>8)+2);
TextureHeight = 32;//texture_sizes[(control_id>>8)-1];
break;
*/
case CTRL_TEX_SIZE_TEXT:
break;
case CTRL_TEX_IMPORT_TEX:
{
FileRequester *fr;
CBYTE fname[100];
fr=new FileRequester("data\\","*.tex","Save A Prim","temp.tex");
if(fr->Draw())
{
strcpy(fname,fr->Path);
strcat(fname,fr->FileName);
import_tex(fname);
}
delete fr;
RequestUpdate();
}
break;
case CTRL_TEX_LOAD_ANIMTMAP:
load_animtmaps();
break;
case CTRL_TEX_SAVE_ANIMTMAP:
save_animtmaps();
break;
case CTRL_TEX_ANIMTMAP_UP:
if(ShowAnimTmap>1)
{
ShowAnimTmap--;
RequestUpdate();
}
break;
case CTRL_TEX_ANIMTMAP_DOWN:
if(ShowAnimTmap<64)
{
ShowAnimTmap++;
RequestUpdate();
}
break;
case CTRL_TEX_PLANAR_MAP:
DoPlanarMap();
break;
case CTRL_TEX_PLANAR_MAPF:
DoPlanarMapF();
break;
case CTRL_TEX_SELECT_DRAWN:
SelectDrawn ^= 1;
break;
// case CTRL_TEX_NO_LIGHT:
// edit_info.FlatShade^=1;
// break;
case CTRL_TEX_NO_HIDDEN:
edit_info.NoHidden^=1;
break;
case CTRL_TEX_ROOF_TEX:
edit_info.RoofTex^=1;
break;
case CTRL_TEX_USE_CLIPPED:
edit_info.Clipped^=2;
break;
case CTRL_TEX_SET_CLIPPED:
extern void find_map_clip(SLONG *minx,SLONG *maxx,SLONG *minz,SLONG *maxz);
{
SLONG minx,maxx,minz,maxz;
find_map_clip(&minx,&maxx,&minz,&maxz);
edit_info.MinX=minx;
edit_info.MinZ=minz;
edit_info.MaxX=maxx;
edit_info.MaxZ=maxz;
edit_info.Clipped=2;
}
break;
}
UpdateTextureInfo();
// DrawTabContent();
// Tidy up display.
if(LockWorkScreen())
{
DrawTab();
UnlockWorkScreen();
}
ShowWorkWindow(0);
}
//---------------------------------------------------------------
void PaintTab::SelectColour(MFPoint *clicked_point)
{
MFPoint local_point;
local_point = *clicked_point;
GlobalToLocal(&local_point);
local_point.X -= PaintRect.GetLeft()+2;
local_point.Y -= PaintRect.GetTop()+2;
CurrentColour = ((local_point.X&0xff)>>4)+(local_point.Y&0xf0);
UpdatePalette();
}
//---------------------------------------------------------------
void find_highest_selected_tmap(SLONG *tx,SLONG *ty)
{
SLONG c0,c1;
struct PrimFace4 *p_f4;
struct PrimFace3 *p_f3;
*tx=1000000;
*ty=1000000;
for(c0=1;c0<next_face_selected;c0++)
{
if(face_selected_list[c0]>0)
{
p_f4=&prim_faces4[face_selected_list[c0]];
for(c1=0;c1<4;c1++)
{
if(p_f4->UV[c1][1]<*ty||(p_f4->UV[c1][1]==*ty&&p_f4->UV[c1][0]<*tx))
{
*tx=p_f4->UV[c1][0];
*ty=p_f4->UV[c1][1];
}
}
}
else
if(face_selected_list[c0]<0)
{
p_f3=&prim_faces3[-face_selected_list[c0]];
for(c1=0;c1<3;c1++)
{
if(p_f3->UV[c1][1]<*ty||(p_f3->UV[c1][1]==*ty&&p_f3->UV[c1][0]<*tx))
{
*tx=p_f3->UV[c1][0];
*ty=p_f3->UV[c1][1];
}
}
}
}
}
void offset_selected_tmaps(SLONG tx,SLONG ty,UBYTE page,SLONG sx,SLONG sy,SLONG flag)
{
SLONG c0,c1;
struct PrimFace4 *p_f4;
struct PrimFace3 *p_f3;
for(c0=1;c0<next_face_selected;c0++)
{
if(face_selected_list[c0]>0)
{
p_f4=&prim_faces4[face_selected_list[c0]];
p_f4->TexturePage=page;
for(c1=0;c1<4;c1++)
{
if( (p_f4->UV[c1][0]==sx&&p_f4->UV[c1][1]==sy) || flag)
{
p_f4->UV[c1][0]+=tx;
p_f4->UV[c1][1]+=ty;
}
}
}
else
if(face_selected_list[c0]<0)
{
p_f3=&prim_faces3[-face_selected_list[c0]];
p_f3->TexturePage=page;
for(c1=0;c1<3;c1++)
{
if((p_f3->UV[c1][0]==sx&&p_f3->UV[c1][1]==sy) ||flag)
{
p_f3->UV[c1][0]+=tx;
p_f3->UV[c1][1]+=ty;
}
}
}
}
}
void scale_selected_tmaps(SWORD scale)
{
SLONG c0,c1;
struct PrimFace4 *p_f4;
struct PrimFace3 *p_f3;
SLONG mid_x=0,mid_y=0,count=0;
for(c0=1;c0<next_face_selected;c0++)
{
if(face_selected_list[c0]>0)
{
p_f4=&prim_faces4[face_selected_list[c0]];
for(c1=0;c1<4;c1++)
{
mid_x+=p_f4->UV[c1][0];
mid_y+=p_f4->UV[c1][1];
count++;
}
}
else
if(face_selected_list[c0]<0)
{
p_f3=&prim_faces3[-face_selected_list[c0]];
for(c1=0;c1<3;c1++)
{
mid_x+=p_f3->UV[c1][0];
mid_y+=p_f3->UV[c1][1];
count++;
}
}
}
if(count)
{
mid_x/=count;
mid_y/=count;
for(c0=1;c0<next_face_selected;c0++)
{
if(face_selected_list[c0]>0)
{
p_f4=&prim_faces4[face_selected_list[c0]];
for(c1=0;c1<4;c1++)
{
SLONG temp;
temp=p_f4->UV[c1][0];
temp-=mid_x;
temp=((temp*scale)/256);
temp+=mid_x;
p_f4->UV[c1][0]=temp;
temp=p_f4->UV[c1][1];
temp-=mid_y;
temp=((temp*scale)/256);
temp+=mid_y;
p_f4->UV[c1][1]=temp;
}
}
else
if(face_selected_list[c0]<0)
{
p_f3=&prim_faces3[-face_selected_list[c0]];
for(c1=0;c1<3;c1++)
{
SLONG temp;
temp=p_f3->UV[c1][0];
temp-=mid_x;
temp=((temp*scale)/256);
temp+=mid_x;
p_f3->UV[c1][0]=temp;
temp=p_f3->UV[c1][1];
temp-=mid_y;
temp=((temp*scale)/256);
temp+=mid_y;
p_f3->UV[c1][1]=temp;
}
}
}
}
}
void offset_selected_tex_page(SWORD offset)
{
SLONG c0,c1;
struct PrimFace4 *p_f4;
struct PrimFace3 *p_f3;
SLONG mid_x=0,mid_y=0,count=0;
SLONG u,v,page;
for(c0=1;c0<next_face_selected;c0++)
{
if(face_selected_list[c0]>0)
{
p_f4=&prim_faces4[face_selected_list[c0]];
page=p_f4->TexturePage;
if(offset==64)
page++;
else
if(offset==-64)
page--;
if(page<0)
page=14;
for(c1=0;c1<4;c1++)
{
u=p_f4->UV[c1][0];
v=p_f4->UV[c1][1];
if(offset==1)
{
u+=32;
if(u>255)
{
u-=256;
v+=32;
if(v>255)
{
page++;
if(page>14)
page=0;
v-=256;
}
}
}
else
if(offset==-1)
{
u-=32;
if(u<0)
{
u+=256;
v-=32;
if(v<0)
{
page--;
if(page<0)
page=14;
v+=256;
}
}
}
p_f4->UV[c1][0]=u;
p_f4->UV[c1][1]=v;
count++;
}
p_f4->TexturePage=page;
}
else
if(face_selected_list[c0]<0)
{
p_f3=&prim_faces3[-face_selected_list[c0]];
page=p_f3->TexturePage;
if(offset==64)
page++;
else
if(offset==-64)
page--;
if(page<0)
page=14;
for(c1=0;c1<3;c1++)
{
u=p_f3->UV[c1][0];
v=p_f3->UV[c1][1];
if(offset==1)
{
u+=32;
if(u>255)
{
u-=255;
v+=32;
if(v>255)
{
page++;
if(page>14)
page=0;
v-=255;
}
}
}
else
if(offset==-1)
{
u-=32;
if(u<0)
{
u+=255;
v-=32;
if(v<0)
{
page--;
if(page<0)
page=14;
v+=255;
}
}
}
p_f3->UV[c1][0]=u;
p_f3->UV[c1][1]=v;
count++;
}
p_f3->TexturePage=page;
}
}
}
void PaintTab::PlanarMapping(MFPoint *clicked_point)
{
SLONG c0,c1,
scale,
texture_x,
texture_y,
dx,
dy,
zoom;
MFPoint current_point,
fixed_point,
local_point;
local_point = *clicked_point;
GlobalToLocal(&local_point);
zoom = 256>>TextureZoom;
TextureFlags |= FLAGS_SHOW_TEXTURE;
// local_point.X = (((local_point.X-(PaintRect.GetLeft()+2))>>(8-TextureZoom)));
// local_point.Y = (((local_point.Y-(PaintRect.GetTop()+2))>>(8-TextureZoom)));
LogText(" Planar local point %d,%d \n",local_point.X,local_point.Y);
LogText(" Planar paint rect %d,%d \n",PaintRect.GetLeft(),PaintRect.GetTop());
local_point.X = (((local_point.X-(PaintRect.GetLeft()+2))));
local_point.Y = (((local_point.Y-(PaintRect.GetTop()+2))));
LogText(" Planar local point %d,%d AFTER -paintrect\n",local_point.X,local_point.Y);
SET_TEXTURE_COORDS
// local_point.X = (local_point.X+texture_x);
// local_point.Y = (local_point.Y+texture_y);
// find_highest_selected_tmap(&dx,&dy);
// LogText(" highest texture %d,%d \n",dx,dy);
// dx-=local_point.X;
// dy-=local_point.Y;
// offset_selected_tmaps(dx,dy);
while(SHELL_ACTIVE && LeftButton)
{
current_point.X = MouseX;
current_point.Y = MouseY;
GlobalToLocal(&current_point);
zoom = 256>>TextureZoom;
// current_point.X = (((current_point.X-(PaintRect.GetLeft()+2))>>(8-TextureZoom)));
// current_point.Y = (((current_point.Y-(PaintRect.GetTop()+2))>>(8-TextureZoom)));
current_point.X = (((current_point.X-(PaintRect.GetLeft()+2))));
current_point.Y = (((current_point.Y-(PaintRect.GetTop()+2))));
SET_TEXTURE_COORDS
// current_point.X = (current_point.X+texture_x);
// current_point.Y = (current_point.Y+texture_y);
if(current_point.X!=local_point.X || current_point.Y!=local_point.Y)
{
dx = local_point.X-current_point.X;
dy = local_point.Y-current_point.Y;
// offset_selected_tmaps(-dx,-dy,CurrentTexturePage);
UpdateTexture();
local_point = current_point;
}
if(LockWorkScreen())
{
Parent->DrawContent();
UnlockWorkScreen();
ShowWorkWindow(0);
}
}
UpdateTexture();
}
void PaintTab::SelectTexture(MFPoint *clicked_point)
{
ULONG drag_flags,
update,
x_quad,
y_quad;
SLONG angle,
c0,c1,
scale,
texture_x,
texture_y,
x_offset,
y_offset,
zoom;
EdTexture temp_texture;
MFPoint current_point,
fixed_point,
local_point;
local_point = *clicked_point;
GlobalToLocal(&local_point);
zoom = 256>>TextureZoom;
local_point.X = (((local_point.X-(PaintRect.GetLeft()+2))>>(8-TextureZoom)));
local_point.Y = (((local_point.Y-(PaintRect.GetTop()+2))>>(8-TextureZoom)));
SET_TEXTURE_COORDS
local_point.X = (local_point.X+texture_x);
local_point.Y = (local_point.Y+texture_y);
if(TextureWidth==8)
current_point.X = local_point.X&~7;
else
current_point.X = local_point.X&~15;
if(TextureHeight==8)
current_point.Y = local_point.Y&~7;
else
current_point.Y = local_point.Y&~15;
if(TextureFlags&FLAGS_QUADS)
c1 = 4;
else
c1 = 3;
if(TextureFlags&FLAGS_FIXED)
{
fixed_point=current_point;
if(TextureFlags&FLAGS_QUADS)
{
update = 0;
for(c0=0;c0<c1;c0++)
{
SLONG width,height;
SLONG sx,sy;
current_point = *clicked_point;
current_point.X -= PaintRect.GetLeft()+2;
current_point.Y -= PaintRect.GetTop()+2;
GlobalToLocal(&current_point);
if(ClickRect[c0].PointInRect(&current_point))
{
update = 1;
MyUndo.MoveTexture(0,CurrentTexturePage,0,CurrentTexture.U[0],CurrentTexture.V[0],CurrentTexture.U[1],CurrentTexture.V[1],
CurrentTexture.U[2],CurrentTexture.V[2],CurrentTexture.U[3],CurrentTexture.V[3]);
//
// Drag a corner of the fixed rectangle
//
while(SHELL_ACTIVE && LeftButton)
{
current_point.X = MouseX;
current_point.Y = MouseY;
GlobalToLocal(&current_point);
zoom = 256>>TextureZoom;
current_point.X = (((current_point.X-(PaintRect.GetLeft()+2))>>(8-TextureZoom)));
current_point.Y = (((current_point.Y-(PaintRect.GetTop()+2))>>(8-TextureZoom)));
SET_TEXTURE_COORDS
current_point.X = (current_point.X+texture_x);
current_point.Y = (current_point.Y+texture_y);
if(current_point.X!=local_point.X || current_point.Y!=local_point.Y)
{
x_offset = local_point.X-current_point.X;
y_offset = local_point.Y-current_point.Y;
if(TextureFlags&FLAGS_QUADS)
{
CurrentTexture.U[c0] -= x_offset;
CurrentTexture.V[c0] -= y_offset;
switch(c0)
{
case 0:
if(CurrentTexture.U[0]>=CurrentTexture.U[1]-1)
CurrentTexture.U[0]=CurrentTexture.U[1]-1;
if(CurrentTexture.V[0]>=CurrentTexture.V[2]-1)
CurrentTexture.V[0]=CurrentTexture.V[2]-1;
break;
case 1:
if(CurrentTexture.U[1]<=CurrentTexture.U[0]+1)
CurrentTexture.U[1]=CurrentTexture.U[0]+1;
if(CurrentTexture.V[1]>=CurrentTexture.V[2]-1)
CurrentTexture.V[1]=CurrentTexture.V[2]-1;
break;
case 2:
if(CurrentTexture.U[2]>=CurrentTexture.U[1]-1)
CurrentTexture.U[2]=CurrentTexture.U[1]-1;
if(CurrentTexture.V[2]<=CurrentTexture.V[0]+1)
CurrentTexture.V[2]=CurrentTexture.V[0]+1;
break;
case 3:
if(CurrentTexture.U[3]<=CurrentTexture.U[0]+1)
CurrentTexture.U[3]=CurrentTexture.U[0]+1;
if(CurrentTexture.V[3]<=CurrentTexture.V[0]+1)
CurrentTexture.V[3]=CurrentTexture.V[0]+1;
break;
}
}
if(c0<2)
width=CurrentTexture.U[1]-CurrentTexture.U[0];
else
{
width=CurrentTexture.U[3]-CurrentTexture.U[2];
if(c0==2)
CurrentTexture.U[0]=CurrentTexture.U[2];
}
TextureWidth=32; //width; //&~31;
if(c0==1||c0==3)
{
height=CurrentTexture.V[3]-CurrentTexture.V[1];
if(c0==1)
CurrentTexture.V[0]=CurrentTexture.V[1];
}
else
height=CurrentTexture.V[2]-CurrentTexture.V[0];
TextureHeight=32; //height; //&~31;
sx=CurrentTexture.U[0];
sy=CurrentTexture.V[0];
CurrentTexture.U[1]=sx+TextureWidth;
CurrentTexture.V[1]=sy;
CurrentTexture.U[2]=sx;
CurrentTexture.V[2]=sy+TextureHeight;
CurrentTexture.U[3]=sx+TextureWidth;
CurrentTexture.V[3]=sy+TextureHeight;
UpdateTexture();
local_point = current_point;
}
} //end of while loop
TextureHeight=32; //(TextureHeight+7)&~15;
TextureWidth=32; //(TextureWidth+7)&~15;
if(TextureHeight<=0)
TextureHeight=8;
if(TextureWidth<=0)
TextureWidth=8;
CurrentTexture.U[0]=(CurrentTexture.U[0]+7)&~15;
CurrentTexture.V[0]=(CurrentTexture.V[0]+7)&~15;
sx=CurrentTexture.U[0];
sy=CurrentTexture.V[0];
CurrentTexture.U[1]=sx+TextureWidth;
CurrentTexture.V[1]=sy;
CurrentTexture.U[2]=sx;
CurrentTexture.V[2]=sy+TextureHeight;
CurrentTexture.U[3]=sx+TextureWidth;
CurrentTexture.V[3]=sy+TextureHeight;
UpdateTexture();
local_point = current_point;
#ifndef PAINT2
if(selected_face.PEle)
{
ApplyTexture(&selected_face);
if(LockWorkScreen())
{
Parent->DrawContent();
UnlockWorkScreen();
ShowWorkWindow(0);
}
}
#endif
break;
}
}
if(!update)
{
current_point=fixed_point;
CurrentTexture.U[0] = current_point.X;
CurrentTexture.V[0] = current_point.Y;
CurrentTexture.U[1] = current_point.X+(TextureWidth-1);
CurrentTexture.V[1] = current_point.Y;
CurrentTexture.U[3] = current_point.X+(TextureWidth-1);
CurrentTexture.V[3] = current_point.Y+(TextureHeight-1);
CurrentTexture.U[2] = current_point.X;
CurrentTexture.V[2] = current_point.Y+(TextureHeight-1);
TextureFlags |= FLAGS_SHOW_TEXTURE;
UpdateTexture();
}
}
else
{
x_quad = (local_point.X&(TextureWidth-1))&~((TextureWidth-1)>>1) ? 1 : 0;
y_quad = (local_point.Y&(TextureHeight-1))&~((TextureHeight-1)>>1) ? 1 : 0;
CurrentTexture.U[0] = current_point.X+(x_quad*(TextureWidth-1));
CurrentTexture.V[0] = current_point.Y+(y_quad*(TextureHeight-1));
CurrentTexture.U[1] = current_point.X+((1^y_quad)*(TextureWidth-1));
CurrentTexture.V[1] = current_point.Y+(x_quad*(TextureHeight-1));
CurrentTexture.U[2] = current_point.X+(y_quad*(TextureWidth-1));
CurrentTexture.V[2] = current_point.Y+((1^x_quad)*(TextureHeight-1));
TextureFlags |= FLAGS_SHOW_TEXTURE;
UpdateTexture();
}
#ifndef PAINT2
if(selected_face.PEle)
{
ApplyTexture(&selected_face);
if(LockWorkScreen())
{
Parent->DrawContent();
UnlockWorkScreen();
ShowWorkWindow(0);
}
}
#endif
}
else
{
update = 0;
for(c0=0;c0<c1;c0++)
{
current_point = *clicked_point;
current_point.X -= PaintRect.GetLeft()+2;
current_point.Y -= PaintRect.GetTop()+2;
GlobalToLocal(&current_point);
if(ClickRect[c0].PointInRect(&current_point))
{
drag_flags = 0;
if(Keys[KB_LCONTROL] || Keys[KB_RCONTROL])
drag_flags = DRAG_CONTROL;
else if(Keys[KB_LSHIFT] || Keys[KB_RSHIFT])
drag_flags = DRAG_SHIFT;
update = 1;
MyUndo.MoveTexture(0,CurrentTexturePage,0,CurrentTexture.U[0],CurrentTexture.V[0],CurrentTexture.U[1],CurrentTexture.V[1],
CurrentTexture.U[2],CurrentTexture.V[2],CurrentTexture.U[3],CurrentTexture.V[3]);
while(SHELL_ACTIVE && LeftButton)
{
current_point.X = MouseX;
current_point.Y = MouseY;
GlobalToLocal(&current_point);
zoom = 256>>TextureZoom;
current_point.X = (((current_point.X-(PaintRect.GetLeft()+2))>>(8-TextureZoom)));
current_point.Y = (((current_point.Y-(PaintRect.GetTop()+2))>>(8-TextureZoom)));
SET_TEXTURE_COORDS
current_point.X = (current_point.X+texture_x);
current_point.Y = (current_point.Y+texture_y);
if(current_point.X!=local_point.X || current_point.Y!=local_point.Y)
{
x_offset = local_point.X-current_point.X;
y_offset = local_point.Y-current_point.Y;
if(selected_face.PEle==(struct EditMapElement*)-1 && face_is_in_list(selected_face.Face))
{
SLONG p;
SLONG sx,sy;
SLONG flag=0;
if(ShiftFlag)
flag=1;
if(selected_face.Face<0)
{
sx=prim_faces3[-selected_face.Face].UV[c0][0];
sy=prim_faces3[-selected_face.Face].UV[c0][1];
}
else
{
sx=prim_faces4[selected_face.Face].UV[c0][0];
sy=prim_faces4[selected_face.Face].UV[c0][1];
}
offset_selected_tmaps(-x_offset,-y_offset,CurrentTexturePage,sx,sy,flag);
for(p=0;p<c1;p++)
{
if((CurrentTexture.U[p]==sx && CurrentTexture.V[p]==sy) || flag)
{
CurrentTexture.U[p] -= x_offset;
CurrentTexture.V[p] -= y_offset;
}
}
}
else
if(TextureFlags&FLAGS_QUADS)
{
switch(drag_flags)
{
case DRAG_NORMAL:
CurrentTexture.U[c0] -= x_offset;
CurrentTexture.V[c0] -= y_offset;
break;
case DRAG_SHIFT:
if(abs(MouseX-clicked_point->X)>=abs(MouseY-clicked_point->Y))
drag_flags = DRAG_SHIFT_H;
else
drag_flags = DRAG_SHIFT_V;
x_offset=0;
y_offset=0;
break;
case DRAG_SHIFT_H:
CurrentTexture.U[c0] -= x_offset;
y_offset=0;
break;
case DRAG_SHIFT_V:
CurrentTexture.V[c0] -= y_offset;
x_offset=0;
break;
case DRAG_CONTROL:
CurrentTexture.U[c0] -= x_offset;
CurrentTexture.V[c0] -= y_offset;
CurrentTexture.U[hooks[c0][0]] -= x_offset;
CurrentTexture.V[hooks[c0][1]] -= y_offset;
break;
}
}
else
{
switch(drag_flags)
{
case DRAG_NORMAL:
CurrentTexture.U[c0] -= x_offset;
CurrentTexture.V[c0] -= y_offset;
break;
case DRAG_SHIFT_H:
CurrentTexture.U[c0] -= x_offset;
break;
case DRAG_SHIFT_V:
CurrentTexture.V[c0] -= y_offset;
break;
case DRAG_CONTROL:
CurrentTexture.U[c0] -= x_offset;
CurrentTexture.V[c0] -= y_offset;
break;
}
}
UpdateTexture();
local_point = current_point;
//#ifndef PAINT2
// if(selected_face.PEle)
{
ApplyTexture(&selected_face);
if(LockWorkScreen())
{
Parent->DrawContent();
UnlockWorkScreen();
ShowWorkWindow(0);
}
}
//#endif
}
}
break;
}
}
if(!update)
{
if (
(
TextureFlags&FLAGS_QUADS
&&
check_big_point_triangle(
MouseX-PaintRect.GetLeft(),MouseY-PaintRect.GetTop(),
ClickRect[1].GetLeft(),ClickRect[1].GetTop(),
ClickRect[2].GetLeft(),ClickRect[2].GetTop(),
ClickRect[3].GetLeft(),ClickRect[3].GetTop()
)
)
||
check_big_point_triangle(
MouseX-PaintRect.GetLeft(),MouseY-PaintRect.GetTop(),
ClickRect[2].GetLeft(),ClickRect[2].GetTop(),
ClickRect[1].GetLeft(),ClickRect[1].GetTop(),
ClickRect[0].GetLeft(),ClickRect[0].GetTop()
)
)
{
drag_flags = DRAG_NORMAL;
if(Keys[KB_LSHIFT] || Keys[KB_RSHIFT])
{
drag_flags = DRAG_SHIFT;
}
angle = 0;
scale = 1;
update = 0;
temp_texture = CurrentTexture;
x_offset = 0;
y_offset = 0;
for(c0=0;c0<c1;c0++)
{
x_offset += temp_texture.U[c0];
y_offset += temp_texture.V[c0];
}
x_offset /= c1;
y_offset /= c1;
for(c0=0;c0<c1;c0++)
{
temp_texture.U[c0] -= x_offset;
temp_texture.V[c0] -= y_offset;
}
MyUndo.MoveTexture(0,CurrentTexturePage,0,CurrentTexture.U[0],CurrentTexture.V[0],CurrentTexture.U[1],CurrentTexture.V[1],
CurrentTexture.U[2],CurrentTexture.V[2],CurrentTexture.U[3],CurrentTexture.V[3]);
while(SHELL_ACTIVE && LeftButton)
{
current_point.X = MouseX;
current_point.Y = MouseY;
GlobalToLocal(&current_point);
zoom = 256>>TextureZoom;
current_point.X = (((current_point.X-(PaintRect.GetLeft()+2))>>(8-TextureZoom)));
current_point.Y = (((current_point.Y-(PaintRect.GetTop()+2))>>(8-TextureZoom)));
SET_TEXTURE_COORDS
current_point.X = (current_point.X+texture_x);
current_point.Y = (current_point.Y+texture_y);
if(current_point.X!=local_point.X || current_point.Y!=local_point.Y)
{
switch(drag_flags)
{
case DRAG_NORMAL:
x_offset -= local_point.X-current_point.X;
y_offset -= local_point.Y-current_point.Y;
break;
case DRAG_SHIFT:
if(abs(MouseX-clicked_point->X)>=abs(MouseY-clicked_point->Y))
drag_flags = DRAG_SHIFT_H;
else
drag_flags = DRAG_SHIFT_V;
break;
case DRAG_SHIFT_H:
x_offset -= local_point.X-current_point.X;
break;
case DRAG_SHIFT_V:
y_offset -= local_point.Y-current_point.Y;
break;
}
update = 1;
local_point = current_point;
}
if(Keys[KB_LEFT])
{
angle = (angle-3)&2047;
update = 1;
}
else if(Keys[KB_RIGHT])
{
angle = (angle+3)&2047;
update = 1;
}
if(Keys[KB_UP])
{
if(scale<100)
scale++;
}
else if(Keys[KB_DOWN])
{
if(scale>1)
scale--;
}
if(update)
{
for(c0=0;c0<c1;c0++)
{
CurrentTexture.U[c0] = x_offset+((((temp_texture.U[c0]*COS(angle))-(temp_texture.V[c0]*SIN(angle)))*scale)>>16);
CurrentTexture.V[c0] = y_offset+((((temp_texture.U[c0]*SIN(angle))+(temp_texture.V[c0]*COS(angle)))*scale)>>16);
}
UpdateTexture();
#ifndef PAINT2
if(selected_face.PEle)
{
ApplyTexture(&selected_face);
if(LockWorkScreen())
{
Parent->DrawContent();
UnlockWorkScreen();
ShowWorkWindow(0);
}
}
#endif
update = 0;
}
}
}
}
}
}
//---------------------------------------------------------------
UWORD PaintTab::ConvertFreeToFixedEle(struct TextureBits *t,SLONG *x,SLONG *y,SLONG *width,SLONG *height,SLONG *page)
{
SLONG size;
t->X=CurrentTexture.U[0]>>3;
t->Y=CurrentTexture.V[0]>>3;
t->Page=CurrentTexturePage;
switch(TextureWidth)
{
case 8:
size=0;
break;
case 16:
size=1;
break;
case 32:
size=2;
break;
case 64:
size=3;
break;
case 96:
size=4;
break;
case 128:
size=5;
break;
case 160:
size=6;
break;
case 192:
size=7;
break;
}
size=32;
t->Width=size;
switch(TextureHeight)
{
case 8:
size=0;
break;
case 16:
size=1;
break;
case 32:
size=2;
break;
case 64:
size=3;
break;
case 96:
size=4;
break;
case 128:
size=5;
break;
case 160:
size=6;
break;
case 192:
size=7;
break;
}
size=32;
t->Height=size;
*x=t->X;
*y=t->Y;
*width=t->Width;
*height=t->Height;
*page=t->Page;
return(1);
}
void PaintTab::ConvertFixedToFree(struct TextureBits *t)
{
UBYTE sx,sy,w,h;
sx=t->X<<3;
sy=t->Y<<3;
w=texture_sizes[t->Width];
h=texture_sizes[t->Height];
CurrentTexture.U[0]=sx;
CurrentTexture.V[0]=sy;
CurrentTexture.U[1]=sx+w;
CurrentTexture.V[1]=sy;
CurrentTexture.U[2]=sx;
CurrentTexture.V[2]=sy+h;
CurrentTexture.U[3]=sx+w;
CurrentTexture.V[3]=sy+h;
TextureWidth=32; //w;
TextureHeight=32; //w;
}
void PaintTab::ConvertMiniTex(struct MiniTextureBits *tex)
{
SLONG sx,sy,w;
SLONG rot;
sx=tex->X<<5;
sy=tex->Y<<5;
rot=tex->Rot;
w=32;//floor_texture_sizes[tex->Size];
CurrentTextureRot=tex->Rot;
CurrentTexturePage=tex->Page;
CurrentTexture.U[0]=sx;
CurrentTexture.V[0]=sy;
CurrentTexture.U[1]=sx+w;
CurrentTexture.V[1]=sy;
CurrentTexture.U[2]=sx;
CurrentTexture.V[2]=sy+w;
CurrentTexture.U[3]=sx+w;
CurrentTexture.V[3]=sy+w;
for(;rot>0;rot--)
{
SLONG temp_u,temp_v;
temp_u = CurrentTexture.U[0];
temp_v = CurrentTexture.V[0];
CurrentTexture.U[0] = CurrentTexture.U[1];
CurrentTexture.V[0] = CurrentTexture.V[1];
CurrentTexture.U[1] = CurrentTexture.U[3];
CurrentTexture.V[1] = CurrentTexture.V[3];
CurrentTexture.U[3] = CurrentTexture.U[2];
CurrentTexture.V[3] = CurrentTexture.V[2];
CurrentTexture.U[2] = temp_u;
CurrentTexture.V[2] = temp_v;
}
TextureWidth=w;
TextureHeight=w;
}
UWORD PaintTab::ConvertTexToMiniTex(void)
{
UBYTE x1, y1, x2, y2, x3, y3, x4, y4, page;
struct MiniTextureBits tex;
tex.X=(CurrentTexture.U[0]+CurrentTexture.U[1]+CurrentTexture.U[2]+CurrentTexture.U[3])>>7;
tex.Y=(CurrentTexture.V[0]+CurrentTexture.V[1]+CurrentTexture.V[2]+CurrentTexture.V[3])>>7;
tex.Page=CurrentTexturePage;
tex.Size=0;
tex.Rot=CurrentTextureRot;
return(*((UWORD*)&tex));
}
BOOL PaintTab::ApplyTexture(struct EditFace *edit_face)
{
SLONG c0;
if(edit_face->PEle==(struct EditMapElement*)-2)
{
if(PaintMode==PALETTE_PAINT)
{
}
else
{
edit_map[edit_face->MapX][edit_face->MapZ].Texture=ConvertTexToMiniTex();
}
}
else
if(edit_face->PEle==(struct EditMapElement*)-1)
{
if(edit_face->Face<0)
{
MyUndo.ApplyPrim3(0,-edit_face->Face,&prim_faces3[-edit_face->Face]);
}
else
{
MyUndo.ApplyPrim4(0,edit_face->Face,&prim_faces4[edit_face->Face]);
}
if(PaintMode==PALETTE_PAINT)
{
if(edit_face->Face<0)
{
prim_faces3[-edit_face->Face].DrawFlags &= ~(POLY_FLAG_TEXTURED);
prim_faces3[-edit_face->Face].Col2 = CurrentColour;
}
else
{
prim_faces4[edit_face->Face].DrawFlags &= ~(POLY_FLAG_TEXTURED);
prim_faces4[edit_face->Face].Col2 = CurrentColour;
}
}
else
{
if(edit_face->Face<0)
{
prim_faces3[-edit_face->Face].DrawFlags |= POLY_FLAG_TEXTURED;
prim_faces3[-edit_face->Face].TexturePage = (UWORD)CurrentTexturePage;
for(c0=0;c0<3;c0++)
{
prim_faces3[-edit_face->Face].UV[c0][0] = CurrentTexture.U[c0];
prim_faces3[-edit_face->Face].UV[c0][1] = CurrentTexture.V[c0];
}
}
else
{
prim_faces4[edit_face->Face].DrawFlags |= POLY_FLAG_TEXTURED;
prim_faces4[edit_face->Face].TexturePage = (UWORD)CurrentTexturePage;
for(c0=0;c0<4;c0++)
{
prim_faces4[edit_face->Face].UV[c0][0] = CurrentTexture.U[c0];
prim_faces4[edit_face->Face].UV[c0][1] = CurrentTexture.V[c0];
}
if(prim_faces4[edit_face->Face].ThingIndex<0)
{
extern void set_wall_texture_info(SLONG wall,UBYTE page,EdTexture *current_texture,UBYTE type,UBYTE side);
UBYTE type=0;
if(PaintMode==STYLE_PAINT)
{
type=CurrentStyleEdit;
set_wall_texture_info(-prim_faces4[edit_face->Face].ThingIndex,(SBYTE)CurrentTexturePage,&CurrentTexture,type,(prim_faces4[edit_face->Face].FaceFlags&FACE_FLAG_TEX2)?1:0);
}
else
{
//
// apply an individual texture to a wall face
//
extern void apply_texture_to_wall_face(SLONG face,SLONG texture);
SLONG t;
SLONG x=0,y=0,c0;
for(c0=0;c0<4;c0++)
{
x+=CurrentTexture.U[c0];
y+=CurrentTexture.V[c0];
}
x>>=7;
y>>=7;
t=x+y*8+CurrentTexturePage*64;
apply_texture_to_wall_face(edit_face->Face,t);
}
}
}
}
return 1;
}
else if(edit_face->PEle)
{
SLONG x,y,width,height,page;
// ConvertFreeToFixedEle(&edit_face->PEle->Textures[edit_face->Face]);
ConvertFreeToFixedEle(&edit_face->PEle->Textures[edit_face->Face],&x,&y,&width,&height,&page);
return 1;
}
return 0;
}
void paint_texture_to_wall(SLONG wall,SLONG pos,SLONG texture)
{
ASSERT(pos<200);
if(wall_list[wall].Tcount<=pos)
{
SLONG size;
UBYTE *old=0;
if(wall_list[wall].Textures&&wall_list[wall].Tcount)
old=wall_list[wall].Textures;
size=pos+1;
if(size<8)
size=8;
wall_list[wall].Textures=(UBYTE*)MemAlloc(size+1);
if(wall_list[wall].Textures==0)
{
wall_list[wall].Tcount=0;
return;
}
if(old && wall_list[wall].Tcount)
{
memcpy(wall_list[wall].Textures,old,wall_list[wall].Tcount+1);
MemFree(old);
}
wall_list[wall].Tcount=size;
}
wall_list[wall].Textures[pos]=texture;
}
void paint_texture_to_wall2(SLONG wall,SLONG pos,SLONG texture)
{
ASSERT(pos<200);
if(wall_list[wall].Tcount2<=pos)
{
SLONG size;
UBYTE *old=0;
if(wall_list[wall].Textures2 && wall_list[wall].Tcount2)
old=wall_list[wall].Textures2;
size=pos+1;
if(size<8)
size=8;
wall_list[wall].Textures2=(UBYTE*)MemAlloc(size+1);
if(wall_list[wall].Textures2==0)
{
wall_list[wall].Tcount2=0;
return;
}
if(old && wall_list[wall].Tcount2)
{
memcpy(wall_list[wall].Textures2,old,wall_list[wall].Tcount2+1);
MemFree(old);
}
wall_list[wall].Tcount2=size;
}
wall_list[wall].Textures2[pos]=texture;
}
void remove_painted_textures(void)
{
SLONG c0;
for(c0=0;c0<MAX_WALLS;c0++)
{
if(wall_list[c0].Textures&&wall_list[c0].Tcount)
{
MemFree(wall_list[c0].Textures);
wall_list[c0].Textures=0;
wall_list[c0].Tcount=0;
}
if(wall_list[c0].Textures2&&wall_list[c0].Tcount2)
{
MemFree(wall_list[c0].Textures);
wall_list[c0].Textures2=0;
wall_list[c0].Tcount2=0;
}
}
}
void remove_style_textures(void)
{
SLONG c0;
for(c0=0;c0<MAX_WALLS;c0++)
{
wall_list[c0].TextureStyle=0;
wall_list[c0].TextureStyle2=0;
}
}
void paint_texture_to_storey(SLONG storey,SLONG pos,SLONG texture)
{
ASSERT(pos<100);
/*
if(storey_list[storey].Tcount<=pos)
{
SLONG size;
if(storey_list[storey].Textures&&storey_list[storey].Tcount)
MemFree(storey_list[storey].Textures);
size=pos;
if(size<8)
size=8;
storey_list[storey].Textures=(UBYTE*)MemAlloc(size);
if(storey_list[storey].Textures==0)
{
storey_list[storey].Tcount=0;
return;
}
storey_list[storey].Tcount=size;
}
storey_list[storey].Textures[pos]=texture;
*/
}
void apply_texture_to_wall_face(SLONG face,SLONG texture)
{
SLONG wall,storey,building;
SLONG c0;
SLONG mx=0,my=0,mz=0;
SLONG head;
SLONG x1,z1;
SLONG dx,dz;
SLONG dist;
// quads only
if(face<0)
{
return;
}
wall=-prim_faces4[face].ThingIndex;
if(wall<=0)
return;
for(c0=0;c0<4;c0++)
{
mx+=prim_points[prim_faces4[face].Points[c0]].X;
my+=prim_points[prim_faces4[face].Points[c0]].Y;
mz+=prim_points[prim_faces4[face].Points[c0]].Z;
}
// ASSERT(wall!=13);
mx>>=2;
my>>=2;
mz>>=2;
if (wall > 0)
{
struct MapThing *p_mthing;
SLONG thing;
storey = wall_list[wall].StoreyHead;
building = storey_list[storey].BuildingHead;
thing = building_list[building].ThingIndex;
p_mthing=TO_MTHING(thing);
mx+=p_mthing->X;
my+=p_mthing->Y;
mz+=p_mthing->Z;
}
//
// find the start point for this wall, storey or another wall
//
storey=wall_list[wall].StoreyHead;
if(storey_list[storey].WallHead==wall)
{
head=-storey;
x1=storey_list[storey].DX;
z1=storey_list[storey].DZ;
}
else
{
SLONG index;
index=storey_list[storey].WallHead;
while(index)
{
if(wall_list[index].Next==wall)
{
head=index;
x1=wall_list[index].DX;
z1=wall_list[index].DZ;
break;
}
index=wall_list[index].Next;
}
}
ASSERT(head);
dx=mx-x1;
dz=mz-z1;
dist=Root(dx*dx+dz*dz);
dist>>=8;
//
// dist is now the face number along this facet to paint
//
/*
if(head<0)
{
paint_texture_to_storey(wall,dist,texture);
}
else
*/
{
if(prim_faces4[face].FaceFlags&FACE_FLAG_TEX2)
{
// this wall is double sided and so uses different texture info
paint_texture_to_wall2(wall,dist,texture);
}
else
{
paint_texture_to_wall(wall,dist,texture);
}
}
}
//---------------------------------------------------------------