bool toggle (bool enable) { if (enable) { editor->SetTextureSelectCallback (callback, this); MdlObject *r = editor->GetMdl()->root; if (r) IterateObjects(r,deselect); } else editor->SetTextureSelectCallback (0, 0); enabled=enable; return true; }
bool Model::SaveS3O(const char *filename, IProgressCtl& /*progctl*/) { S3OHeader header; size_t write_result; memset (&header,0,sizeof(S3OHeader)); memcpy (header.magic, S3O_ID, 12); if (!root) return false; FILE *f = fopen (filename, "wb"); if (!f) return false; fseek (f, sizeof(S3OHeader), SEEK_SET); header.rootPiece = ftell(f); if (root) { MdlObject *cloned = root->Clone(); IterateObjects (cloned, ApplyOrientationAndScaling); MirrorX(cloned); S3O_SaveObject (f, cloned); delete cloned; } for (uint tex=0;tex<texBindings.size();tex++) { if (tex >= texBindings.size ()) break; TextureBinding &tb = texBindings[tex]; if (!tb.name.empty()) { if (tex==0) header.texture1 = ftell(f); if (tex==1) header.texture2 = ftell(f); WriteZStr (f, tb.name); } } header.radius = radius; header.height = height; header.midx = -mid.x; header.midy = mid.y; header.midz = mid.z; fseek (f, 0, SEEK_SET); write_result = fwrite (&header, sizeof(S3OHeader), 1, f); if (write_result != (size_t)1) throw std::runtime_error ("Couldn't write S3O header."); fclose (f); return true; }
// TODO: Abstract file formats Model* Model::Load (const char *fn, bool Optimize, IProgressCtl& progctl) { const char *ext=fltk::filename_ext(fn); Model *mdl = 0; try { if (!STRCASECMP(ext, ".opk")) mdl = Model::LoadOPK (fn, progctl); else { bool r; mdl = new Model; if ( !STRCASECMP(ext, ".3do") ) r = mdl->Load3DO (fn, progctl); else if( !STRCASECMP(ext, ".s3o" )) r = mdl->LoadS3O (fn, progctl); else if(!STRCASECMP(ext, ".3ds")) r = (mdl->root = Load3DSObject (fn, progctl)) != 0; else if (!STRCASECMP(ext, ".obj")) r = (mdl->root = LoadWavefrontObject (fn, progctl)) != 0; else if (!STRCASECMP(ext, ".c3o")) r = mdl->LoadC3O (fn, progctl); else { fltk::message ("Unknown extension %s\n", fltk::filename_ext(fn)); delete mdl; return false; } if (!r) { delete mdl; mdl = 0; } } } catch (std::runtime_error err) { fltk::message (err.what()); return false; } if (mdl) { if (mdl->root && Optimize) IterateObjects (mdl->root, InitObject); return mdl; } else { fltk::message ("Failed to read file %s:\n",fn); return 0; } }
bool Model::Save3DO (const char *fn, IProgressCtl& progctl) { FILE *f = fopen(fn, "wb"); if (!f) return false; MdlObject *cl = root->Clone(); IterateObjects (cl, ApplyOrientationAndScaling); vector<MdlObject*> tmp; tmp.push_back (cl); save_object (f, 0, tmp.begin()); fclose (f); delete cl; return true; }
void click (){ Model *m=editor->GetMdl(); if (m->root) IterateObjects (m->root,togglecurved); editor->RedrawViews(); }
void click (){ Model *m=editor->GetMdl(); if (m->root) IterateObjects (m->root,rotatetex); BACKUP_POINT("3DO texture rotated"); editor->RedrawViews(); }
void click (){ Model *m=editor->GetMdl(); if (m->root) IterateObjects (m->root,flip); BACKUP_POINT("Flipped selected polygons"); editor->RedrawViews(); }