Files
Mujoco_WASM/unity/Tests/Editor/Importer/MjImporterTests.cs
T
Saran Tunyasuvunakool 3577e2cf8b Version 2.1.2: Python bindings, OBJ assets support, bugfixes.
PiperOrigin-RevId: 434731612
Change-Id: I0cfda3e7a3d1c72036764986efc252ffa1b8c6b0
2022-03-15 14:04:44 +00:00

186 lines
6.5 KiB
C#

// Copyright 2019 DeepMind Technologies Limited
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Xml;
using NUnit.Framework;
using UnityEditor;
using UnityEngine;
using UnityEngine.TestTools;
namespace Mujoco {
[TestFixture]
public class MjMaterialImportTests {
private GameObject _sceneRoot;
private bool _removeLocal = false;
private bool _removeLocalMujoco = false;
private MjImporterWithAssets _importer;
[SetUp]
public void SetUp() {
_importer = new MjImporterWithAssets();
LogAssert.ignoreFailingMessages = true;
// these two directories may exist from previous imports
string[] assetsRoot = {"Assets"};
var guids = AssetDatabase.FindAssets("Local", assetsRoot);
if (guids.Length == 0) {
_removeLocal = true;
AssetDatabase.CreateFolder("Assets", "Local");
}
string[] assetsLocal = {"Assets/Local"};
guids = AssetDatabase.FindAssets("MjImports", assetsLocal);
if (guids.Length == 0) {
_removeLocalMujoco = true;
}
}
[TearDown]
public void TearDown() {
LogAssert.ignoreFailingMessages = false;
if (_sceneRoot != null) {
UnityEngine.Object.DestroyImmediate(_sceneRoot);
}
// remove main resources folder:
// string[] mainTestResources = {"Assets/Local/Mujoco/MjMaterialImportTests/Resources"};
// foreach (var asset in AssetDatabase.FindAssets("", mainTestResources)) {
// AssetDatabase.DeleteAsset(AssetDatabase.GUIDToAssetPath(asset));
// }
// // remove main resources folder:
// AssetDatabase.DeleteAsset(mainTestResources[0]);
// remove all test folders:
string[] assetLocalMujoco = {"Assets/Local/MjImports"};
foreach (var asset in AssetDatabase.FindAssets("MjMaterialImportTests", assetLocalMujoco)) {
AssetDatabase.DeleteAsset(AssetDatabase.GUIDToAssetPath(asset));
}
if (_removeLocalMujoco) {
AssetDatabase.DeleteAsset("Assets/Local/MjImports");
}
if (_removeLocal) {
AssetDatabase.DeleteAsset("Assets/Local");
}
}
[Test]
public void ParsingMaterialProperties() {
var mjcfString = @"<mujoco>
<asset>
<material name='test_material'
rgba='.7 .5 .3 .1' specular='.5' shininess='.7' reflectance='.2'/>
</asset>
<worldbody>
<body>
<geom name='test_geom' material='test_material' size='1 1 1'/>
</body>
</worldbody>
</mujoco>";
_sceneRoot = _importer.ImportString(
name: "MjMaterialImportTests", mjcfString: mjcfString);
var geom = _sceneRoot.GetComponentInChildren<MjGeom>();
Assert.That(geom, Is.Not.Null);
var meshRenderer = geom.GetComponent<MeshRenderer>();
Assert.That(meshRenderer, Is.Not.Null);
Assert.That(meshRenderer.sharedMaterial, Is.Not.Null);
Assert.That(meshRenderer.sharedMaterial.color, Is.EqualTo(new Color(0.7f, 0.5f, 0.3f, 0.1f)));
Assert.That(meshRenderer.sharedMaterial.GetFloat("_Metallic"), Is.EqualTo(0.2f));
Assert.That(meshRenderer.sharedMaterial.GetFloat("_Glossiness"), Is.GreaterThan(0.0f));
}
[Test]
public void ParsingMaterialWithoutEmissivity() {
var mjcfString = @"<mujoco>
<asset>
<material name='test_material' rgba='.7 .5 .3 .1'/>
</asset>
<worldbody>
<body>
<geom name='test_geom' material='test_material' size='1 1 1'/>
</body>
</worldbody>
</mujoco>";
_sceneRoot = _importer.ImportString(
name: "MjMaterialImportTests", mjcfString: mjcfString);
var geom = _sceneRoot.GetComponentInChildren<MjGeom>();
Assert.That(geom, Is.Not.Null);
var meshRenderer = geom.GetComponent<MeshRenderer>();
Assert.That(meshRenderer, Is.Not.Null);
Assert.That(meshRenderer.sharedMaterial, Is.Not.Null);
Assert.That(meshRenderer.sharedMaterial.shaderKeywords, Has.No.Member("_EMISSION"));
}
[Test]
public void ParsingMaterialWithEmissivity() {
var mjcfString = @"<mujoco>
<asset>
<material name='test_material' rgba='.7 .5 .3 .1' emission='1'/>
</asset>
<worldbody>
<body>
<geom name='test_geom' material='test_material' size='1 1 1'/>
</body>
</worldbody>
</mujoco>";
_sceneRoot = _importer.ImportString(
name: "MjMaterialImportTests", mjcfString: mjcfString);
var geom = _sceneRoot.GetComponentInChildren<MjGeom>();
Assert.That(geom, Is.Not.Null);
var meshRenderer = geom.GetComponent<MeshRenderer>();
Assert.That(meshRenderer, Is.Not.Null);
Assert.That(meshRenderer.sharedMaterial, Is.Not.Null);
Assert.That(meshRenderer.sharedMaterial.shaderKeywords, Has.Member("_EMISSION"));
Assert.That(
meshRenderer.sharedMaterial.GetColor("_EmissionColor"),
Is.EqualTo(new Color(0.7f, 0.5f, 0.3f, 0.1f)));
}
[Test]
public void ResettingColorDatabaseForEachImport() {
var mjcfString1 = @"<mujoco>
<asset>
<material name='test_material' rgba='.2 .2 .2 .2'/>
</asset>
<worldbody>
<body>
<geom name='test_geom' material='test_material' size='1 1 1'/>
</body>
</worldbody>
</mujoco>";
var mjcfString2 = @"<mujoco>
<asset>
<material name='test_material' rgba='.5 .5 .5 .5'/>
</asset>
<worldbody>
<body>
<geom name='test_geom' material='test_material' size='1 1 1'/>
</body>
</worldbody>
</mujoco>";
_sceneRoot = new GameObject();
var importedMesh1 = _importer.ImportString(
name: "MjMaterialImportTests"+$"{UnityEngine.Random.Range(0,999)}", mjcfString: mjcfString1);
importedMesh1.transform.parent = _sceneRoot.transform;
var importedMesh2 = _importer.ImportString(
name: "MjMaterialImportTests"+$"{UnityEngine.Random.Range(0,999)}", mjcfString: mjcfString2);
importedMesh2.transform.parent = _sceneRoot.transform;
var geom = importedMesh2.GetComponentInChildren<MjGeom>();
var meshRenderer = geom.GetComponent<MeshRenderer>();
Assert.That(meshRenderer.sharedMaterial.color, Is.EqualTo(new Color(0.5f, 0.5f, 0.5f, 0.5f)));
}
}
}