add llSetRenderMaterial (ugly code)

This commit is contained in:
UbitUmarov
2026-02-22 11:51:58 +00:00
parent 511c4c637c
commit eaed2f5b02
5 changed files with 215 additions and 2 deletions

View File

@@ -19612,6 +19612,123 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return 0;
}
public void llSetRenderMaterial(LSL_String materialstr, LSL_Integer lsl_face)
{
if(m_materialsModule is null)
return;
if(string.IsNullOrEmpty(materialstr.m_string))
{
Error("llSetRenderMaterial", "material \"\" not found");
return;
}
int face = lsl_face.value;
bool changed;
if(UUID.ZeroString.Equals(materialstr.m_string, StringComparison.OrdinalIgnoreCase))
{
if(m_host.Shape.RenderMaterials is null || m_host.Shape.RenderMaterials.entries is null || m_host.Shape.RenderMaterials.entries.Length == 0)
return;
changed = m_materialsModule.CleanMaterialOverrides(ref m_host.Shape.RenderMaterials.overrides, face);
if(face == ScriptBaseClass.ALL_SIDES)
{
m_host.Shape.RenderMaterials.entries = null;
changed = true;
}
else
changed |= m_materialsModule.RemoveMaterialEntry(ref m_host.Shape.RenderMaterials.entries, face);
if(changed)
{
m_host.ParentGroup.HasGroupChanged = true;
m_host.ScheduleUpdate(PrimUpdateFlags.MaterialOvr | PrimUpdateFlags.FullUpdate);
m_host.TriggerScriptChangedEvent(Changed.MATERIAL);
}
return;
}
UUID matID = ScriptUtils.GetAssetIdFromItemName(m_host, materialstr.m_string, (int)AssetType.Material);
if (matID.IsZero())
{
if (!UUID.TryParse(materialstr.m_string, out matID) || matID.IsZero())
{
Error("llSetRenderMaterial", $"material \"{materialstr.m_string}\" not found");
return;
}
}
int nsides = GetNumberOfSides(m_host);
if(face >= nsides)
return;
m_host.Shape.RenderMaterials ??= new();
m_host.Shape.RenderMaterials.entries ??= new Primitive.RenderMaterials.RenderMaterialEntry[1];
changed = m_materialsModule.CleanMaterialOverrides(ref m_host.Shape.RenderMaterials.overrides, face);
if(face == ScriptBaseClass.ALL_SIDES)
{
if(m_host.Shape.RenderMaterials.entries is null || m_host.Shape.RenderMaterials.entries.Length != nsides)
{
m_host.Shape.RenderMaterials.entries = new Primitive.RenderMaterials.RenderMaterialEntry[nsides];
for (int i = 0; i < m_host.Shape.RenderMaterials.entries.Length; i++)
{
m_host.Shape.RenderMaterials.entries[i] = new()
{
te_index = (byte)i,
id = matID
};
}
changed = true;
}
else
{
for (int i = 0; i < m_host.Shape.RenderMaterials.entries.Length; i++)
{
if(matID.NotEqual(m_host.Shape.RenderMaterials.entries[i].id))
{
changed = true;
m_host.Shape.RenderMaterials.entries[i].id = matID;
}
}
}
}
else
{
int indx = 0;
for( ; indx < m_host.Shape.RenderMaterials.entries.Length; indx++)
{
if (m_host.Shape.RenderMaterials.entries[indx].te_index == face)
{
if(matID.NotEqual(m_host.Shape.RenderMaterials.entries[indx].id))
{
changed = true;
m_host.Shape.RenderMaterials.entries[indx].id = matID;
}
break;
}
}
if(indx == m_host.Shape.RenderMaterials.entries.Length)
{
Array.Resize(ref m_host.Shape.RenderMaterials.entries, m_host.Shape.RenderMaterials.entries.Length + 1);
m_host.Shape.RenderMaterials.entries[indx] = new()
{
te_index = (byte)face,
id = matID
};
changed = true;
}
}
if(changed)
{
m_host.ParentGroup.HasGroupChanged = true;
m_host.ScheduleUpdate(PrimUpdateFlags.MaterialOvr | PrimUpdateFlags.FullUpdate);
m_host.TriggerScriptChangedEvent(Changed.MATERIAL);
}
}
public LSL_Vector llWorldPosToHUD(LSL_Vector wp)
{
if(!m_host.ParentGroup.IsAttachment)

View File

@@ -537,5 +537,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
LSL_String llGetRenderMaterial(LSL_Integer face);
LSL_Integer llIsLinkGLTFMaterial(LSL_Integer linknum, LSL_Integer face);
LSL_Vector llWorldPosToHUD(LSL_Vector WorldPosition);
void llSetRenderMaterial(LSL_String material, LSL_Integer face);
}
}

View File

@@ -2899,5 +2899,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
{
return m_LSL_Functions.llWorldPosToHUD(WorldPosition);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public void llSetRenderMaterial(LSL_String material, LSL_Integer face)
{
m_LSL_Functions.llSetRenderMaterial(material, face);
}
}
}