SL-17325 apply inventory material to face

master
Dave Houlton 2022-05-04 14:33:55 -06:00
parent fa26abf901
commit cce5fdca84
2 changed files with 132 additions and 12 deletions

View File

@ -2319,7 +2319,11 @@ void LLPanelFace::onCommitMaterialMaskCutoff(LLUICtrl* ctrl, void* userdata)
void LLPanelFace::onCommitMaterialID(LLUICtrl* ctrl, void* userdata)
{
LLPanelFace* self = static_cast<LLPanelFace*>(userdata);
LLSelectedTEMaterial::setMaterialID(self, self->getCurrentMaterialID());
LLUUID matID = self->getCurrentMaterialID();
LLSelectedTEMaterial::setMaterialID(self, matID);
// Temporary demo hack - replace the TE entries with those from the Material's LLSD
applyMaterialUUID(matID, userdata);
}
// static
@ -2564,27 +2568,26 @@ void LLPanelFace::onAlignTexture(void* userdata)
#include "llviewerassetupload.h"
#include "llviewermenufile.h"
#include "llsd.h"
#pragma warning (disable: 4189)
void LLPanelFace::onSaveMaterial(void* userdata)
{
// DRTVWR-559, Q&D material picker - save to inventory goes here
LL_DEBUGS("Material") << "saving material to inventory" << LL_ENDL;
LLPanelFace* self = (LLPanelFace*)userdata;
LL_DEBUGS("Material") << "saving render material to inventory" << LL_ENDL;
std::string name = "New Material";
LLSD* mat_llsd = new LLSD("Surely you jest...");
// TBD populate mat_llsd with material data
self->onCloseTexturePicker(*mat_llsd); // certainly wrong, but something like this?
// gen a new uuid for this asset
LLTransactionID tid;
tid.generate();
tid.generate(); // timestamp-based randomization + uniquification
LLAssetID new_asset_id = tid.makeAssetID(gAgent.getSecureSessionID());
LLFileSystem fmt_file(new_asset_id, LLAssetType::AT_MATERIAL, LLFileSystem::WRITE);
fmt_file.write(mat_llsd->asBinary().data(), mat_llsd->size());
// populate mat_llsd with material data
LLSD* mat_llsd = new LLSD();
renderMaterialToLLSD(mat_llsd, new_asset_id, userdata);
LLFileSystem material_file(new_asset_id, LLAssetType::AT_MATERIAL, LLFileSystem::WRITE);
material_file.write(mat_llsd->asBinary().data(), mat_llsd->size());
delete(mat_llsd);
S32 expected_upload_cost = 0;// LLAgentBenefitsMgr::current().getTextureUploadCost();
@ -2612,6 +2615,120 @@ void LLPanelFace::onSaveMaterial(void* userdata)
upload_new_resource(p_upload_info);
}
// Fill an LLSD with data describing the current face's texture settings
// TODO 2022-05 FUBAR there are both colliding and different data in LLPanelFace vs the TE. Also, neither one has the diffuse tex settings.
//
void LLPanelFace::renderMaterialToLLSD(LLSD* sd, LLUUID uuid, void* userdata)
{
llassert(userdata != nullptr);
sd->insert("RenderMaterialUUID", LLSD(uuid));
/* pf stuff is probably useless
// pull data from the LLPanelFace
LLPanelFace* instance = static_cast<LLPanelFace*>(userdata);
sd->insert("pfNormalMap", LLSD(instance->getCurrentNormalMap()));
sd->insert("pfSpecularMap", LLSD(instance->getCurrentSpecularMap()));
sd->insert("pfShininess", LLSD(static_cast<S32>(instance->getCurrentShininess())));
sd->insert("pfBumpiness", LLSD(static_cast<S32>(instance->getCurrentBumpiness())));
sd->insert("pfAlphaMode", LLSD(static_cast<S32>(instance->getCurrentDiffuseAlphaMode())));
sd->insert("pfAlphaCutoff", LLSD(static_cast<S32>(instance->getCurrentAlphaMaskCutoff())));
sd->insert("pfEnvIntensity", LLSD(static_cast<S32>(instance->getCurrentEnvIntensity())));
sd->insert("pfGlossiness", LLSD(static_cast<S32>(instance->getCurrentGlossiness())));
sd->insert("pfNormalRotation", LLSD(instance->getCurrentBumpyRot()));
sd->insert("pfNormalScaleU", LLSD(instance->getCurrentBumpyScaleU()));
sd->insert("pfNormalScaleV", LLSD(instance->getCurrentBumpyScaleV()));
sd->insert("pfNormalOffsetU", LLSD(instance->getCurrentBumpyOffsetU()));
sd->insert("pfNormalOffsetV", LLSD(instance->getCurrentBumpyOffsetV()));
sd->insert("pfSpecularRotation", LLSD(instance->getCurrentShinyRot()));
sd->insert("pfSpecularScaleU", LLSD(instance->getCurrentShinyScaleU()));
sd->insert("pfSpecularScaleV", LLSD(instance->getCurrentShinyScaleV()));
sd->insert("pfSpecularOffsetU", LLSD(instance->getCurrentShinyOffsetU()));
sd->insert("pfSpecularOffsetV", LLSD(instance->getCurrentShinyOffsetV()));
sd->insert("pfMaterialID", LLSD(instance->getCurrentMaterialID()));
*/
// now pull same data from the selected TE (same but different. W T F?)
LLMaterialPtr mat = nullptr;
bool ident; // ?
LLSelectedTEMaterial::getCurrent(mat, ident);
sd->insert("teMaterialID", LLSD(mat->getMaterialID()));
sd->insert("teNormalMap", LLSD(mat->getNormalID()));
sd->insert("teNormalOffsetX", LLSD(mat->getNormalOffsetX()));
sd->insert("teNormalOffsetY", LLSD(mat->getNormalOffsetY()));
sd->insert("teNormalRepeatX", LLSD(mat->getNormalRepeatX()));
sd->insert("teNormalRepeatY", LLSD(mat->getNormalRepeatY()));
sd->insert("teNormalRotation", LLSD(mat->getNormalRotation()));
sd->insert("teSpecularMap", LLSD(mat->getSpecularID()));
LLColor4U color = mat->getSpecularLightColor();
sd->insert("teSpecularColorR", LLSD(static_cast<S32>(color.mV[0])));
sd->insert("teSpecularColorG", LLSD(static_cast<S32>(color.mV[1])));
sd->insert("teSpecularColorB", LLSD(static_cast<S32>(color.mV[2])));
sd->insert("teSpecularColorA", LLSD(static_cast<S32>(color.mV[3])));
sd->insert("teSpecularExponent", LLSD(static_cast<S32>(mat->getSpecularLightExponent())));
sd->insert("teSpecularOffsetX", LLSD(mat->getSpecularOffsetX()));
sd->insert("teSpecularOffsetY", LLSD(mat->getSpecularOffsetY()));
sd->insert("teSpecularRepeatX", LLSD(mat->getSpecularRepeatX()));
sd->insert("teSpecularRepeatY", LLSD(mat->getSpecularRepeatY()));
sd->insert("teSpecularRotation", LLSD(mat->getSpecularRotation()));
sd->insert("teAlphaMode", LLSD(static_cast<S32>(mat->getDiffuseAlphaMode())));
sd->insert("teAlphaCutoff", LLSD(static_cast<S32>(mat->getAlphaMaskCutoff())));
sd->insert("teEnvIntensity", LLSD(static_cast<S32>(mat->getEnvironmentIntensity())));
sd->insert("teShaderMask", LLSD(static_cast<S32>(mat->getShaderMask())));
}
// Take the individual texture settings from the material and apply to current face & TE
void LLPanelFace::applyMaterialUUID(LLUUID uuid, void* userdata)
{
llassert(userdata != nullptr);
//LLPanelFace* instance = static_cast<LLPanelFace*>(userdata);
LLFileSystem material_file(uuid, LLAssetType::AT_MATERIAL, LLFileSystem::READ);
S32 bufsize = material_file.getSize();
llassert(bufsize > 0);
U8* buffer = new U8(bufsize);
material_file.read(buffer, bufsize);
LLSD* matSD = (LLSD*) buffer; // static_cast complains here (?)
llassert(uuid == matSD->get("MaterialUUID").asUUID()); // if not, whoo boy
LLMaterialPtr mat = nullptr;
bool ident; // ?
LLSelectedTEMaterial::getCurrent(mat, ident);
mat->setMaterialID(matSD->get("teMaterialID").asUUID());
mat->setNormalID(matSD->get("teNormalMap").asUUID());
mat->setNormalOffsetX(matSD->get("teNormalOffsetX").asReal());
mat->setNormalOffsetY(matSD->get("teNormalOffsetY").asReal());
mat->setNormalRepeatX(matSD->get("teNormalRepeatX").asReal());
mat->setNormalRepeatY(matSD->get("teNormalRepeatY").asReal());
mat->setNormalRotation(matSD->get("teNormalRotation").asReal());
mat->setSpecularID(matSD->get("teSpecularMap").asUUID());
LLColor4U color;
color.mV[0] = static_cast<U8>(matSD->get("teSecularColorR").asInteger());
color.mV[1] = static_cast<U8>(matSD->get("teSecularColorG").asInteger());
color.mV[2] = static_cast<U8>(matSD->get("teSecularColorB").asInteger());
color.mV[3] = static_cast<U8>(matSD->get("teSecularColorA").asInteger());
mat->setSpecularLightColor(color);
mat->setSpecularLightExponent(static_cast<U8>(matSD->get("teSpecularExponent").asInteger()));
mat->setSpecularOffsetX(matSD->get("teSpecularOffsetX").asReal());
mat->setSpecularOffsetY(matSD->get("teSpecularOffsetY").asReal());
mat->setSpecularRepeatX(matSD->get("teSpecularRepeatX").asReal());
mat->setSpecularRepeatY(matSD->get("teSpecularRepeatY").asReal());
mat->setSpecularRotation(matSD->get("teSpecularRotation").asReal());
mat->setDiffuseAlphaMode(static_cast<U8>(matSD->get("teAlphaMode").asInteger()));
mat->setAlphaMaskCutoff(static_cast<U8>(matSD->get("teAlphaCutoff").asInteger()));
mat->setEnvironmentIntensity(static_cast<U8>(matSD->get("teEnvIntensity").asInteger()));
//mat->setShaderMask(static_cast<U32>(matSD->get(teShaderMask").asInteger());
}
// TODO: I don't know who put these in or what these are for???
void LLPanelFace::setMediaURL(const std::string& url)

View File

@ -205,7 +205,10 @@ protected:
static void onCommitRepeatsPerMeter( LLUICtrl* ctrl, void* userinfo);
static void onClickAutoFix(void*);
static void onAlignTexture(void*);
static void onSaveMaterial(void*);
static void renderMaterialToLLSD(LLSD* sd, LLUUID uuid, void* userdata);
static void applyMaterialUUID(LLUUID uuid, void*);
static F32 valueGlow(LLViewerObject* object, S32 face);