void ISCExport::saveISC(const TCHAR *name,ExpInterface *ei,Interface *i) { SceneEnumerator enumerator(ei,i); // No triobjects to export -> quit if (enumerator.numTriobjects()==0) return; size_t objnum=0; unsigned long chunksize,namessize=0; FILE *outfile=fopen(name,"wb"); if (!outfile) return; for (objnum=0;objnum<enumerator.numTriobjects();++objnum) namessize+=(unsigned long)(enumerator.triobjectname(objnum).length())+1; fwrite("isc0",1,4,outfile); fwrite("objt",1,4,outfile); chunksize=(unsigned long)(enumerator.numTriobjects()*(3*sizeof(float)+4*sizeof(float)+4))+namessize; fwrite(&chunksize,1,4,outfile); { DWORD numobjs=(DWORD)(enumerator.numTriobjects()); fwrite(&numobjs,1,4,outfile); } for (objnum=0;objnum<enumerator.numTriobjects();++objnum) { TriObject *pTriobj=enumerator.triobject(objnum); std::string objname=enumerator.triobjectname(objnum); Matrix3 *pTM=enumerator.triobjecttransform(objnum); /*Point3 trans=pTM->GetTrans(); Quat rot(*pTM);*/ AffineParts parts; decomp_affine(*pTM,&parts); Point3 trans=parts.t; Quat rot=parts.q; //float ang[3]; //QuatToEuler(rot,ang); /*rot.GetEuler(&ang[0],&ang[1],&ang[2]); //{ float f=ang[1]; ang[1]=ang[2]; ang[2]=f; } rot.SetEuler(ang[0],ang[2],ang[1]);*/ trans.x=trans.y=trans.z=0; rot.Identity(); fwrite(objname.c_str(),1,objname.length()+1,outfile); //trans.x*=-1; fwrite(&(trans.x),1,sizeof(float),outfile); fwrite(&(trans.y),1,sizeof(float),outfile); fwrite(&(trans.z),1,sizeof(float),outfile); fwrite(&(rot.x),1,sizeof(float),outfile); fwrite(&(rot.y),1,sizeof(float),outfile); fwrite(&(rot.z),1,sizeof(float),outfile); fwrite(&(rot.w),1,sizeof(float),outfile); fwrite(&objnum,1,4,outfile); } fwrite("mesh",1,4,outfile); chunksize=(unsigned long)(enumerator.numTriobjects()*(2*4 + 3*4 + 4 + (3+3+2+3+3)*sizeof(float)))+namessize; fwrite(&chunksize,1,4,outfile); { DWORD numobjs=(DWORD)(enumerator.numTriobjects()); fwrite(&numobjs,1,4,outfile); } for (objnum=0;objnum<enumerator.numTriobjects();++objnum) { Matrix3 *pTM=enumerator.triobjecttransform(objnum); TriObject *pTriobj=enumerator.triobject(objnum); std::string objname=enumerator.triobjectname(objnum); fwrite(objname.c_str(),1,objname.length()+1,outfile); saveMesh(outfile,pTriobj,pTM,enumerator.triobjectmaterial(objnum),enumerator); } fwrite("mtrl",1,4,outfile); chunksize=0; fwrite(&chunksize,1,4,outfile); { DWORD nummtrls=(DWORD)(enumerator.numMaterials()); fwrite(&nummtrls,1,4,outfile); } for (size_t mtrlnum=0;mtrlnum<enumerator.numMaterials();++mtrlnum) { Mtl* pMtl=enumerator.material(mtrlnum); saveMaterial(outfile,pMtl); } fclose(outfile); }
void ResourceModel::fillMaterialInfo(Lumix::Material* material, Node& node) { auto object = Object<Lumix::Material>(material, &node); node.m_getter = [material]() -> QVariant { return material->getPath().c_str(); }; node.m_name = "Material"; object.getNode().onCreateEditor = [this, material]( QWidget* parent, const QStyleOptionViewItem&) -> QWidget* { auto* widget = new QWidget(parent); auto* layout = new QHBoxLayout(widget); layout->setContentsMargins(0, 0, 0, 0); auto* label = new QLabel(material->getPath().c_str(), widget); layout->addWidget(label); layout->addStretch(); QPushButton* button = new QPushButton("Save", widget); connect(button, &QPushButton::clicked, [this, material]() { saveMaterial(material); }); layout->addWidget(button); return widget; }; object.getNode().enablePeristentEditor(); object.property("Alpha cutout", &Lumix::Material::isAlphaCutout, &Lumix::Material::enableAlphaCutout) .property("Backface culling", &Lumix::Material::isBackfaceCulling, &Lumix::Material::enableBackfaceCulling) .property("Shadow receiver", &Lumix::Material::isShadowReceiver, &Lumix::Material::enableShadowReceiving) .property("Shininess", &Lumix::Material::getShininess, &Lumix::Material::setShininess) .propertyColor("Specular", &Lumix::Material::getSpecular, &Lumix::Material::setSpecular) .property( "Z test", &Lumix::Material::isZTest, &Lumix::Material::enableZTest) .property("Shader", [](Lumix::Material* material) -> QVariant { return material->getShader() ? material->getShader()->getPath().c_str() : ""; }, [this](Lumix::Material* material, QVariant value) { setMaterialShader(material, value.toString()); }); auto shader_node = object.getNode().m_children.back(); shader_node->enablePeristentEditor(); shader_node->onCreateEditor = [shader_node](QWidget* parent, const QStyleOptionViewItem&) { auto input = new FileInput(parent); input->setValue(shader_node->m_getter().toString()); input->connect(input, &FileInput::valueChanged, [shader_node, input]() { shader_node->m_setter(input->value()); }); return input; }; for (int i = 0; i < material->getUniformCount(); ++i) { auto& uniform = material->getUniform(i); QString name = uniform.m_name; object.property(uniform.m_name, [name](Lumix::Material* material) -> QVariant { Lumix::Material::Uniform* uniform = getMaterialUniform(material, name); if (uniform) { switch (uniform->m_type) { case Lumix::Material::Uniform::FLOAT: return uniform->m_float; } } return QVariant(); }, [name](Lumix::Material* material, const QVariant& value) { Lumix::Material::Uniform* uniform = getMaterialUniform(material, name); if (uniform) { switch (uniform->m_type) { case Lumix::Material::Uniform::FLOAT: uniform->m_float = value.toFloat(); break; } } }); } for (int i = 0; material->getShader() && i < material->getShader()->getTextureSlotCount(); ++i) { const auto& slot = material->getShader()->getTextureSlot(i); Object<const Lumix::Shader::TextureSlot> slot_object( &slot, &object.getNode().addChild(slot.m_name)); auto& node = slot_object.getNode(); auto texture = material->getTexture(i); if (texture) { fillTextureInfo(texture, node); } node.m_name = slot.m_name; node.m_getter = [texture]() -> QVariant { return texture ? texture->getPath().c_str() : ""; }; node.onCreateEditor = [&node, i, texture, material]( QWidget* parent, const QStyleOptionViewItem&) -> QWidget* { auto input = new FileInput(parent); input->setValue(texture ? texture->getPath().c_str() : ""); input->connect(input, &FileInput::valueChanged, [&node, input]() { node.m_setter(input->value()); }); return input; }; node.m_setter = [material, i](const QVariant& value) { if (value.isValid()) { material->setTexturePath( i, Lumix::Path(value.toString().toLatin1().data())); } }; node.enablePeristentEditor(); } }
MainWindow::MainWindow(QWidget* parent) : QMainWindow(parent), m_ui(new Ui::MainWindow), m_context(0), m_sync(0), m_loadedScenes(0) { if (!s_instance) s_instance = this; m_ui->setupUi(this); //m_ui->filelist->init(); m_ui->renderpass_properties->init(); m_ui->material_properties->init(); createViewport(); /* QDockWidget *dw = new QDockWidget; dw->setObjectName("Foo"); dw->setWindowTitle("Bar"); dw->setWidget(new QTextEdit); addDockWidget(Qt::LeftDockWidgetArea, dw);*/ //m_ui->properties connect(m_ui->action_textures, SIGNAL(triggered()), this, SLOT(openTextureBrowser())); connect(m_ui->error_list, SIGNAL(itemActivated(QTableWidgetItem*)), this, SLOT(errorItemActivated(QTableWidgetItem*))); connect(m_ui->action_savematerial, SIGNAL(triggered()), this, SLOT(saveMaterial())); connect(m_ui->action_open, SIGNAL(triggered()), this, SLOT(load())); connect(m_ui->action_savescene, SIGNAL(triggered()), this, SLOT(saveScene())); connect(m_ui->action_newscene, SIGNAL(triggered()), this, SLOT(newScene())); connect(m_ui->action_savescene_as, SIGNAL(triggered()), this, SLOT(saveSceneAs())); /*connect(m_ui->action_new, SIGNAL(triggered()), this, SLOT(open())); connect(m_ui->action_saveas, SIGNAL(triggered()), this, SLOT(open())); connect(m_ui->action_open, SIGNAL(triggered()), this, SLOT(open()));*/ connect(m_ui->action_autosave_scene, SIGNAL(triggered(bool)), this, SLOT(setAutosaveScene(bool))); connect(m_ui->action_import, SIGNAL(triggered()), this, SLOT(import())); connect(m_ui->action_reload, SIGNAL(triggered()), this, SLOT(reload())); QAction* actions[] = {m_ui->action_toggle_materials, m_ui->action_toggle_render_passes, m_ui->action_toggle_error_log }; QDockWidget* widgets[] = {m_ui->materials_dock, m_ui->render_passes_dock, m_ui->error_dock}; for (size_t i = 0; i < sizeof(actions)/sizeof(*actions); ++i) { connect(actions[i], SIGNAL(triggered(bool)), widgets[i], SLOT(setVisible(bool))); connect(widgets[i], SIGNAL(visibilityChanged(bool)), actions[i], SLOT(setChecked(bool))); } connect(m_ui->action_reset_layout, SIGNAL(triggered()), this, SLOT(resetLayout())); connect(m_ui->action_about, SIGNAL(triggered()), this, SLOT(about())); connect(m_ui->editor_tabs, SIGNAL(tabCloseRequested(int)), this, SLOT(closeEditor(int))); connect(m_ui->action_sandbox_compiler, SIGNAL(toggled(bool)), this, SLOT(setSandboxCompiler(bool))); QSettings settings("Shaderkit", "Shaderkit"); m_ui->action_autosave_scene->setChecked(settings.value("gui/autosave_scene", true).toBool()); m_ui->action_sandbox_compiler->setChecked(settings.value("core/use_sandbox_compiler", true).toBool()); { m_ui->editor_menu->layout()->setMargin(0); QIcon icon(":/btns/nosync.png"); icon.addFile(":/btns/sync.png", QSize(), QIcon::Normal, QIcon::On); m_sync = m_ui->editor_menu->addAction(icon, "Auto-compile"); m_sync->setCheckable(true); m_sync->setChecked(true); icon.addFile(":/btns/sync.png", QSize(), QIcon::Normal, QIcon::On); m_ui->editor_menu->addAction(QIcon(":/btns/compile.png"), "Compile all", this, SLOT(compileAll())); } }