Esempio n. 1
0
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();
	}
}
Esempio n. 3
0
  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()));
    }
  }