mirror of
				https://github.com/zenorogue/hyperrogue.git
				synced 2025-10-26 19:37:40 +00:00 
			
		
		
		
	when loading textures in the texture mode, you can now tune individual triangles
This commit is contained in:
		
							
								
								
									
										8
									
								
								hyper.h
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								hyper.h
									
									
									
									
									
								
							| @@ -2027,10 +2027,16 @@ typedef array<GLfloat, 3> glvec3; | |||||||
| typedef array<GLfloat, 4> glvec4; | typedef array<GLfloat, 4> glvec4; | ||||||
| typedef glvec3 glvertex; | typedef glvec3 glvertex; | ||||||
|  |  | ||||||
|  | struct texture_triangle { | ||||||
|  |   array<hyperpoint, 3> v; | ||||||
|  |   array<hyperpoint, 3> tv; | ||||||
|  |   texture_triangle(array<hyperpoint, 3> _v, array<hyperpoint, 3> _tv) : v(_v), tv(_tv) {} | ||||||
|  |   }; | ||||||
|  |  | ||||||
| struct textureinfo { | struct textureinfo { | ||||||
|   transmatrix M; |   transmatrix M; | ||||||
|   int texture_id; |   int texture_id; | ||||||
|   vector<array<hyperpoint, 3>> triangles; |   vector<texture_triangle> triangles; | ||||||
|   vector<glvertex> vertices; |   vector<glvertex> vertices; | ||||||
|   vector<glvertex> tvertices;  |   vector<glvertex> tvertices;  | ||||||
|   cell *c; |   cell *c; | ||||||
|   | |||||||
| @@ -40,10 +40,10 @@ namespace mapeditor { | |||||||
|        } |        } | ||||||
|  |  | ||||||
|      vid.scale *= z; |      vid.scale *= z; | ||||||
|      printf("scale = " LDF "\n", vid.scale); |      // printf("scale = " LDF "\n", vid.scale); | ||||||
|      #if CAP_TEXTURE |      #if CAP_TEXTURE | ||||||
|      texture::itt = xyscale(texture::itt, 1/z); |      texture::itt = xyscale(texture::itt, 1/z); | ||||||
|      display(texture::itt); |      // display(texture::itt); | ||||||
|      if(texture::tstate) { |      if(texture::tstate) { | ||||||
|        calcparam(); |        calcparam(); | ||||||
|        texture::perform_mapping(); |        texture::perform_mapping(); | ||||||
|   | |||||||
							
								
								
									
										202
									
								
								textures.cpp
									
									
									
									
									
								
							
							
						
						
									
										202
									
								
								textures.cpp
									
									
									
									
									
								
							| @@ -236,28 +236,29 @@ transmatrix itt = Id; | |||||||
|  |  | ||||||
| unsigned grid_color = 0; | unsigned grid_color = 0; | ||||||
| unsigned mesh_color = 0; | unsigned mesh_color = 0; | ||||||
| unsigned master_color = 0xFFFFFF10; | unsigned master_color = 0xFFFFFF30; | ||||||
| unsigned slave_color = 0xFF000008; | unsigned slave_color = 0xFF000008; | ||||||
|  |  | ||||||
| int color_alpha = 128; | int color_alpha = 128; | ||||||
|  |  | ||||||
| int gsplits = 1; | int gsplits = 1; | ||||||
|  |  | ||||||
| void mapTextureTriangle(textureinfo &mi, array<hyperpoint, 3> v, int splits = gsplits) { | void mapTextureTriangle(textureinfo &mi, const array<hyperpoint, 3>& v, const array<hyperpoint, 3>& tv, int splits = gsplits) { | ||||||
|  |  | ||||||
|   if(splits) { |   if(splits) { | ||||||
|     array<hyperpoint, 3> v2 = make_array( mid(v[1], v[2]), mid(v[2], v[0]), mid(v[0], v[1]) ); |     array<hyperpoint, 3> v2 = make_array( mid(v[1], v[2]), mid(v[2], v[0]), mid(v[0], v[1]) ); | ||||||
|     mapTextureTriangle(mi, make_array(v[0], v2[2], v2[1]), splits-1); |     array<hyperpoint, 3> tv2 = make_array( mid(tv[1], tv[2]), mid(tv[2], tv[0]), mid(tv[0], tv[1]) ); | ||||||
|     mapTextureTriangle(mi, make_array(v[1], v2[0], v2[2]), splits-1); |     mapTextureTriangle(mi, make_array(v[0], v2[2], v2[1]),  make_array(tv[0], tv2[2], tv2[1]),  splits-1); | ||||||
|     mapTextureTriangle(mi, make_array(v[2], v2[1], v2[0]), splits-1); |     mapTextureTriangle(mi, make_array(v[1], v2[0], v2[2]),  make_array(tv[1], tv2[0], tv2[2]),  splits-1); | ||||||
|     mapTextureTriangle(mi, make_array(v2[0], v2[1], v2[2]), splits-1); |     mapTextureTriangle(mi, make_array(v[2], v2[1], v2[0]),  make_array(tv[2], tv2[1], tv2[0]),  splits-1); | ||||||
|  |     mapTextureTriangle(mi, make_array(v2[0], v2[1], v2[2]), make_array(tv2[0], tv2[1], tv2[2]), splits-1); | ||||||
|     return; |     return; | ||||||
|     } |     } | ||||||
|      |      | ||||||
|   for(int i=0; i<3; i++) { |   for(int i=0; i<3; i++) { | ||||||
|     mi.vertices.push_back(glhr::pointtogl(v[i])); |     mi.vertices.push_back(glhr::pointtogl(v[i])); | ||||||
|     hyperpoint inmodel; |     hyperpoint inmodel; | ||||||
|     applymodel(mi.M * v[i], inmodel); |     applymodel(tv[i], inmodel); | ||||||
|     inmodel = itt * inmodel; |     inmodel = itt * inmodel; | ||||||
|     inmodel[0] *= vid.radius * 1. / vid.scrsize; |     inmodel[0] *= vid.radius * 1. / vid.scrsize; | ||||||
|     inmodel[1] *= vid.radius * 1. / vid.scrsize; |     inmodel[1] *= vid.radius * 1. / vid.scrsize; | ||||||
| @@ -265,10 +266,37 @@ void mapTextureTriangle(textureinfo &mi, array<hyperpoint, 3> v, int splits = gs | |||||||
|     }   |     }   | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | texture_triangle *edited_triangle; | ||||||
|  | textureinfo *edited_tinfo; | ||||||
|  |  | ||||||
|  | vector<hyperpoint*> tuned_vertices; | ||||||
|  |  | ||||||
| map<int, textureinfo> texture_map, texture_map_orig; | map<int, textureinfo> texture_map, texture_map_orig; | ||||||
|  |  | ||||||
| set<cell*> models; | set<cell*> models; | ||||||
|  |  | ||||||
|  | array<hyperpoint, 3> findTextureTriangle(cell *c, patterns::patterninfo& si, int i) { | ||||||
|  |   // auto si = getpatterninfo0(c); | ||||||
|  |   transmatrix M = shmup::ggmatrix(c) * applyPatterndir(c, si);   | ||||||
|  |   ld z = ctof(c) ? rhexf : hexvdist; | ||||||
|  |   hyperpoint h1 =  spin(M_PI + M_PI * (2*i -1) / c->type) * xpush(z) * C0; | ||||||
|  |   hyperpoint h2 =  spin(M_PI + M_PI * (2*i +1) / c->type) * xpush(z) * C0; | ||||||
|  |   return make_array(M * C0, M * h1, M * h2); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | // using: mouseh, mouseouver | ||||||
|  | int getTriangleID(cell *c, patterns::patterninfo& si, hyperpoint h) { | ||||||
|  |   // auto si = getpatterninfo0(c); | ||||||
|  |   ld quality = 1e10; | ||||||
|  |   int best = 0; | ||||||
|  |   for(int i=0; i<c->type; i++) { | ||||||
|  |     auto t = findTextureTriangle(c, si, i); | ||||||
|  |     ld q = intval(t[1], h) + intval(t[2], h); | ||||||
|  |     if(q < quality) quality = q, best = i; | ||||||
|  |     } | ||||||
|  |   return best; | ||||||
|  |   } | ||||||
|  |  | ||||||
| void mapTexture(cell *c, textureinfo& mi, patterns::patterninfo &si, const transmatrix& T, int shift = 0) { | void mapTexture(cell *c, textureinfo& mi, patterns::patterninfo &si, const transmatrix& T, int shift = 0) { | ||||||
|   mi.c = c; |   mi.c = c; | ||||||
|   mi.symmetries = si.symmetries; |   mi.symmetries = si.symmetries; | ||||||
| @@ -283,7 +311,7 @@ void mapTexture(cell *c, textureinfo& mi, patterns::patterninfo &si, const trans | |||||||
|     int i2 = i+shift; |     int i2 = i+shift; | ||||||
|     hyperpoint h1 =  spin(M_PI + M_PI * (2*i2 -1) / c->type) * xpush(z) * C0; |     hyperpoint h1 =  spin(M_PI + M_PI * (2*i2 -1) / c->type) * xpush(z) * C0; | ||||||
|     hyperpoint h2 =  spin(M_PI + M_PI * (2*i2 +1) / c->type) * xpush(z) * C0; |     hyperpoint h2 =  spin(M_PI + M_PI * (2*i2 +1) / c->type) * xpush(z) * C0; | ||||||
|     mi.triangles.push_back(make_array(C0, h1, h2)); |     mi.triangles.emplace_back(make_array(C0, h1, h2), make_array(mi.M*C0, mi.M*h1, mi.M*h2)); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -291,7 +319,7 @@ void mapTexture2(textureinfo& mi) { | |||||||
|   mi.vertices.clear(); |   mi.vertices.clear(); | ||||||
|   mi.tvertices.clear(); |   mi.tvertices.clear(); | ||||||
|   for(auto& t: mi.triangles) |   for(auto& t: mi.triangles) | ||||||
|     mapTextureTriangle(mi, t); |     mapTextureTriangle(mi, t.v, t.tv); | ||||||
|   } |   } | ||||||
|    |    | ||||||
| int recolor(int col) { | int recolor(int col) { | ||||||
| @@ -376,7 +404,7 @@ void mark_triangles() { | |||||||
|       for(auto& t: mi.second.triangles) { |       for(auto& t: mi.second.triangles) { | ||||||
|         vector<hyperpoint> t2; |         vector<hyperpoint> t2; | ||||||
|         for(int i=0; i<3; i++) |         for(int i=0; i<3; i++) | ||||||
|           t2.push_back(mi.second.M * t[i]); |           t2.push_back(t.tv[i]); | ||||||
|         prettypoly(t2, master_color, master_color, gsplits); |         prettypoly(t2, master_color, master_color, gsplits); | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
| @@ -388,11 +416,25 @@ static const auto current_texture_parameters = tie(geometry, nonbitrunc, pattern | |||||||
|  |  | ||||||
| texture_parameters orig_texture_parameters; | texture_parameters orig_texture_parameters; | ||||||
|  |  | ||||||
|  | bool texture_tuned = false; | ||||||
|  | string texture_tuner; | ||||||
|  |  | ||||||
|  | void clear_texture_map() { | ||||||
|  |   texture_map.clear(); | ||||||
|  |   edited_triangle = nullptr; | ||||||
|  |   edited_tinfo = nullptr; | ||||||
|  |   tuned_vertices.clear(); | ||||||
|  |   models.clear(); | ||||||
|  |   texture_tuned = false; | ||||||
|  |   texture_tuner = ""; | ||||||
|  |   } | ||||||
|  |    | ||||||
| void perform_mapping() { | void perform_mapping() { | ||||||
|   if(gsplits < 0) gsplits = 0; |   if(gsplits < 0) gsplits = 0; | ||||||
|   if(gsplits > 4) gsplits = 4; |   if(gsplits > 4) gsplits = 4; | ||||||
|   using namespace patterns; |   using namespace patterns; | ||||||
|   texture_map.clear(); |    | ||||||
|  |   clear_texture_map(); | ||||||
|  |  | ||||||
|   for(auto& p: gmatrix) { |   for(auto& p: gmatrix) { | ||||||
|     cell *c = p.first; |     cell *c = p.first; | ||||||
| @@ -413,11 +455,6 @@ void perform_mapping() { | |||||||
|       } |       } | ||||||
|     } |     } | ||||||
|    |    | ||||||
|   if(tstate == tsActive) |  | ||||||
|     for(auto& mi: texture_map) |  | ||||||
|       mapTexture2(mi.second); |  | ||||||
|  |  | ||||||
|   models.clear(); |  | ||||||
|   for(auto& t: texture_map) models.insert(t.second.c); |   for(auto& t: texture_map) models.insert(t.second.c); | ||||||
|    |    | ||||||
|   for(auto& p: gmatrix) { |   for(auto& p: gmatrix) { | ||||||
| @@ -436,7 +473,13 @@ void perform_mapping() { | |||||||
|   texture::cgroup = patterns::cgroup; |   texture::cgroup = patterns::cgroup; | ||||||
|   texture_map_orig = texture_map; |   texture_map_orig = texture_map; | ||||||
|   orig_texture_parameters = current_texture_parameters; |   orig_texture_parameters = current_texture_parameters; | ||||||
|   printf("texture_map has %d elements (S%d)\n", size(texture_map), tstate); |   // printf("texture_map has %d elements (S%d)\n", size(texture_map), tstate); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | void finish_mapping() { | ||||||
|  |   if(tstate == tsActive) | ||||||
|  |     for(auto& mi: texture_map) | ||||||
|  |       mapTexture2(mi.second); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| void saveFullTexture() { | void saveFullTexture() { | ||||||
| @@ -454,6 +497,7 @@ void saveFullTexture() { | |||||||
|   itt = xyscale(Id, vid.scrsize * 1. / vid.radius); |   itt = xyscale(Id, vid.scrsize * 1. / vid.radius); | ||||||
|   readtexture(); |   readtexture(); | ||||||
|   perform_mapping(); |   perform_mapping(); | ||||||
|  |   finish_mapping(); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| bool newmove = false; | bool newmove = false; | ||||||
| @@ -611,7 +655,7 @@ void applyMagic() { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
| enum eTexturePanstate {tpsModel, tpsMove, tpsScale, tpsAffine, tpsZoom, tpsProjection}; | enum eTexturePanstate {tpsModel, tpsMove, tpsScale, tpsAffine, tpsZoom, tpsProjection, tpsCell, tpsTriangle, tpsTune}; | ||||||
| eTexturePanstate panstate; | eTexturePanstate panstate; | ||||||
|  |  | ||||||
| void mousemovement() { | void mousemovement() { | ||||||
| @@ -670,6 +714,64 @@ void mousemovement() { | |||||||
|       newmove = false; |       newmove = false; | ||||||
|       } |       } | ||||||
|      |      | ||||||
|  |     case tpsCell: { | ||||||
|  |       cell *c = mouseover; | ||||||
|  |       if(!c) break; | ||||||
|  |       auto si = patterns::getpatterninfo0(c); | ||||||
|  |       if(newmove) { | ||||||
|  |         edited_tinfo = NULL; | ||||||
|  |         if(texture_map.count(si.id)) { | ||||||
|  |           edited_tinfo = &texture_map[si.id]; | ||||||
|  |           newmove = false; | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       if(edited_tinfo && size(edited_tinfo->triangles) == c->type) { | ||||||
|  |         for(int i=0; i<c->type; i++) | ||||||
|  |           edited_tinfo->triangles[i].tv = findTextureTriangle(c, si, i); | ||||||
|  |         texture_tuned = true; | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |      | ||||||
|  |     case tpsTriangle: { | ||||||
|  |       cell *c = mouseover; | ||||||
|  |       if(!c) break; | ||||||
|  |       auto si = patterns::getpatterninfo0(c); | ||||||
|  |       int i = getTriangleID(c, si, mouseh); | ||||||
|  |       if(newmove) { | ||||||
|  |         edited_triangle = NULL; | ||||||
|  |         if(texture_map.count(si.id)) { | ||||||
|  |           edited_triangle = &texture_map[si.id].triangles[i]; | ||||||
|  |           newmove = false; | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       if(edited_triangle) { | ||||||
|  |         edited_triangle->tv = findTextureTriangle(c, si, i); | ||||||
|  |         texture_tuned = true; | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |     case tpsTune: { | ||||||
|  |       ld tdist = 1e20; | ||||||
|  |       if(newmove) { | ||||||
|  |         tuned_vertices.clear(); | ||||||
|  |         for(auto& a: texture_map) | ||||||
|  |           for(auto& t: a.second.triangles) | ||||||
|  |             for(auto& v: t.tv) | ||||||
|  |               if(intval(v, mouseh) < tdist) | ||||||
|  |                 tdist = intval(v, mouseh); | ||||||
|  |         for(auto& a: texture_map) | ||||||
|  |           for(auto& t: a.second.triangles) | ||||||
|  |             for(auto& v: t.tv) | ||||||
|  |               if(intval(v, mouseh) < tdist * (1.000001)) | ||||||
|  |                 tuned_vertices.push_back(&v); | ||||||
|  |         newmove = false; | ||||||
|  |         } | ||||||
|  |       for(auto v: tuned_vertices) { | ||||||
|  |         *v = mouseh; | ||||||
|  |         texture_tuned = true; | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |      | ||||||
|     default: break; |     default: break; | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
| @@ -720,6 +822,7 @@ void init_textureconfig() { | |||||||
|   addsaver(vid.scale, "scale", 1); |   addsaver(vid.scale, "scale", 1); | ||||||
|    |    | ||||||
|   addsaver(texturename, "texture filename", ""); |   addsaver(texturename, "texture filename", ""); | ||||||
|  |   addsaver(texture_tuner, "texture tuning", ""); | ||||||
|    |    | ||||||
|   swap(texturesavers, savers); |   swap(texturesavers, savers); | ||||||
|   } |   } | ||||||
| @@ -729,6 +832,17 @@ bool save_textureconfig() { | |||||||
|   FILE *f = fopen(configname.c_str(), "wt"); |   FILE *f = fopen(configname.c_str(), "wt"); | ||||||
|   if(!f) return false; |   if(!f) return false; | ||||||
|    |    | ||||||
|  |   if(texture_tuned) { | ||||||
|  |     texture_tuner = ""; | ||||||
|  |     for(auto& a: texture_map) | ||||||
|  |       for(auto& t: a.second.triangles) | ||||||
|  |         for(auto& v: t.tv)  | ||||||
|  |           for(int i=0; i<3; i++) { | ||||||
|  |             texture_tuner += ftssmart(v[i]); | ||||||
|  |             texture_tuner += ';'; | ||||||
|  |             } | ||||||
|  |     } | ||||||
|  |  | ||||||
|   targetgeometry = geometry; |   targetgeometry = geometry; | ||||||
|   target_nonbitru = nonbitrunc; |   target_nonbitru = nonbitrunc; | ||||||
|  |  | ||||||
| @@ -786,7 +900,37 @@ bool load_textureconfig() { | |||||||
|   calcparam(); |   calcparam(); | ||||||
|   drawthemap(); |   drawthemap(); | ||||||
|   tstate = tstate_max = tsActive; |   tstate = tstate_max = tsActive; | ||||||
|  |   string s = move(texture_tuner); | ||||||
|   perform_mapping(); |   perform_mapping(); | ||||||
|  |    | ||||||
|  |   texture_tuner = move(s); | ||||||
|  |    | ||||||
|  |   if(texture_tuner != "") { | ||||||
|  |     texture_tuned = true; | ||||||
|  |     vector<ld*> coords; | ||||||
|  |     for(auto& a: texture_map) | ||||||
|  |       for(auto& t: a.second.triangles) | ||||||
|  |         for(auto& v: t.tv)  | ||||||
|  |           for(int i=0; i<3; i++)  | ||||||
|  |             coords.push_back(&v[i]); | ||||||
|  |     int semicounter = 0; | ||||||
|  |     for(char c: texture_tuner) if(c == ';') semicounter++; | ||||||
|  |     if(semicounter != size(coords)) | ||||||
|  |       addMessage("Tuning error: wrong number"); | ||||||
|  |     else { | ||||||
|  |       string cur = ""; | ||||||
|  |       int index = 0; | ||||||
|  |       for(char c: texture_tuner) | ||||||
|  |         if(c == ';') { | ||||||
|  |           *(coords[index++]) = atof(cur.c_str()); | ||||||
|  |           cur = ""; | ||||||
|  |           } | ||||||
|  |         else cur += c; | ||||||
|  |       printf("index = %d semi = %d sc = %d\n", index, semicounter, size(coords)); | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |   finish_mapping(); | ||||||
|   return true; |   return true; | ||||||
|   } |   } | ||||||
|  |  | ||||||
| @@ -911,9 +1055,17 @@ void showMenu() { | |||||||
|     dialog::addBoolItem(XLAT("affine transformations"), panstate == tpsAffine, 'y'); |     dialog::addBoolItem(XLAT("affine transformations"), panstate == tpsAffine, 'y'); | ||||||
|     dialog::addBoolItem(XLAT("magic"), false, 'A'); |     dialog::addBoolItem(XLAT("magic"), false, 'A'); | ||||||
|      |      | ||||||
|  |     dialog::addBreak(50); | ||||||
|  |  | ||||||
|  |     dialog::addBoolItem(XLAT("select master cells"), panstate == tpsCell, 'C'); | ||||||
|  |     dialog::addBoolItem(XLAT("select master triangles"), panstate == tpsTriangle, 'T'); | ||||||
|  |     dialog::addBoolItem(XLAT("fine tune vertices"), panstate == tpsTune, 'F'); | ||||||
|  |  | ||||||
|     dialog::addColorItem(XLAT("grid color (master)"), master_color, 'M'); |     dialog::addColorItem(XLAT("grid color (master)"), master_color, 'M'); | ||||||
|     dialog::addColorItem(XLAT("grid color (copy)"), slave_color, 'C'); |     dialog::addColorItem(XLAT("grid color (copy)"), slave_color, 'C'); | ||||||
|      |      | ||||||
|  |     dialog::addBreak(50); | ||||||
|  |      | ||||||
|     dialog::addSelItem(XLAT("precision"), its(gsplits), 'P'); |     dialog::addSelItem(XLAT("precision"), its(gsplits), 'P'); | ||||||
|     dialog::addItem(XLAT("save the raw texture"), 'S'); |     dialog::addItem(XLAT("save the raw texture"), 'S'); | ||||||
|     } |     } | ||||||
| @@ -962,6 +1114,9 @@ void showMenu() { | |||||||
|     else if(uni == 'y' && tstate == tsAdjusting) panstate = tpsAffine; |     else if(uni == 'y' && tstate == tsAdjusting) panstate = tpsAffine; | ||||||
|     else if(uni == 'z' && tstate == tsAdjusting) panstate = tpsZoom; |     else if(uni == 'z' && tstate == tsAdjusting) panstate = tpsZoom; | ||||||
|     else if(uni == 'p' && tstate == tsAdjusting) panstate = tpsProjection; |     else if(uni == 'p' && tstate == tsAdjusting) panstate = tpsProjection; | ||||||
|  |     else if(uni == 'C' && tstate == tsAdjusting) panstate = tpsCell; | ||||||
|  |     else if(uni == 'T' && tstate == tsAdjusting) panstate = tpsTriangle; | ||||||
|  |     else if(uni == 'F' && tstate == tsAdjusting) panstate = tpsTune; | ||||||
|     else if(uni == 'A' && tstate == tsAdjusting)  |     else if(uni == 'A' && tstate == tsAdjusting)  | ||||||
|       pushScreen(showMagicMenu); |       pushScreen(showMagicMenu); | ||||||
|  |  | ||||||
| @@ -987,6 +1142,7 @@ void showMenu() { | |||||||
|             if(tstate_max == tsOff) tstate_max = tsAdjusting; |             if(tstate_max == tsOff) tstate_max = tsAdjusting; | ||||||
|             tstate = tstate_max; |             tstate = tstate_max; | ||||||
|             perform_mapping(); |             perform_mapping(); | ||||||
|  |             finish_mapping(); | ||||||
|             return true; |             return true; | ||||||
|             } |             } | ||||||
|           else return false; |           else return false; | ||||||
| @@ -1008,6 +1164,7 @@ void showMenu() { | |||||||
|       if(whitetexture() && loadTextureGL()) { |       if(whitetexture() && loadTextureGL()) { | ||||||
|         tstate = tstate_max = tsActive; |         tstate = tstate_max = tsActive; | ||||||
|         perform_mapping(); |         perform_mapping(); | ||||||
|  |         finish_mapping(); | ||||||
|         mapeditor::initdraw(cwt.c); |         mapeditor::initdraw(cwt.c); | ||||||
|         pushScreen(mapeditor::showDrawEditor); |         pushScreen(mapeditor::showDrawEditor); | ||||||
|         } |         } | ||||||
| @@ -1018,7 +1175,7 @@ void showMenu() { | |||||||
|      |      | ||||||
|     else if(uni == 't' && tstate == tsAdjusting) { |     else if(uni == 't' && tstate == tsAdjusting) { | ||||||
|       tstate = tstate_max = tsActive; |       tstate = tstate_max = tsActive; | ||||||
|       perform_mapping(); |       finish_mapping(); | ||||||
|       } |       } | ||||||
|  |  | ||||||
|     else if(uni == 't' && tstate == tsActive)  |     else if(uni == 't' && tstate == tsActive)  | ||||||
| @@ -1047,9 +1204,7 @@ void showMenu() { | |||||||
|     else if(uni == 'P') { |     else if(uni == 'P') { | ||||||
|       dialog::editNumber(gsplits, 0, 4, 1, 1, XLAT("precision"), |       dialog::editNumber(gsplits, 0, 4, 1, 1, XLAT("precision"), | ||||||
|         XLAT("precision")); |         XLAT("precision")); | ||||||
|       if(tstate == tsActive) dialog::reaction = [] () { |       if(tstate == tsActive) dialog::reaction = [] () { finish_mapping(); | ||||||
|           for(auto& mi: texture_map) |  | ||||||
|             mapTexture2(mi.second); |  | ||||||
|         }; |         }; | ||||||
|       } |       } | ||||||
|     else if(uni == 'S' && tstate == tsAdjusting)  |     else if(uni == 'S' && tstate == tsAdjusting)  | ||||||
| @@ -1242,7 +1397,7 @@ void drawLine(hyperpoint h1, hyperpoint h2, int col, int steps) { | |||||||
|   } |   } | ||||||
|  |  | ||||||
| void remap(eTextureState old_tstate, eTextureState old_tstate_max) { | void remap(eTextureState old_tstate, eTextureState old_tstate_max) { | ||||||
|   texture_map.clear(); |   clear_texture_map(); | ||||||
|   if(old_tstate == tsActive && patterns::compatible(texture::cgroup, patterns::cgroup)) { |   if(old_tstate == tsActive && patterns::compatible(texture::cgroup, patterns::cgroup)) { | ||||||
|    |    | ||||||
|     tstate = old_tstate; |     tstate = old_tstate; | ||||||
| @@ -1290,6 +1445,7 @@ void remap(eTextureState old_tstate, eTextureState old_tstate_max) { | |||||||
|     calcparam(); |     calcparam(); | ||||||
|     drawthemap(); |     drawthemap(); | ||||||
|     perform_mapping(); |     perform_mapping(); | ||||||
|  |     finish_mapping(); | ||||||
|     printf("texture_map size = %d\n", size(texture_map)); |     printf("texture_map size = %d\n", size(texture_map)); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Zeno Rogue
					Zeno Rogue