Ejemplo n.º 1
0
    public ResourceRef <ITexture> Resolve(string filename, bool withMipMaps)
    {
        var filenameLower = filename.ToLowerInvariant();

        if (mTexturesByName.TryGetValue(filenameLower, out var textureRef))
        {
            return(textureRef.Resource.Ref());
        }

        // Texture is not registered yet, so let's do that
        if (!_fs.FileExists(filename))
        {
            Logger.Error("Cannot register texture '{0}', because it does not exist.", filename);
            var result = InvalidTexture.Ref();
            mTexturesByName[filenameLower] = result;
            return(result.CloneRef());
        }

        var id = mNextFreeId++;

        var texture = new ResourceRef <ITexture>(new FileTexture(mLoader, id, filename));

        Trace.Assert(!mTexturesByName.ContainsKey(filenameLower));
        Trace.Assert(!mTexturesById.ContainsKey(id));
        mTexturesByName[filenameLower] = texture.CloneRef();
        mTexturesById[id] = texture.CloneRef();

        return(texture);
    }
    public ResourceRef <IMdfRenderMaterial> LoadMaterial(string name, Action <MdfMaterial> customizer = null)
    {
        var nameLower = name.ToLowerInvariant();

        // Do not cache if a customizer is present
        if (customizer == null && mNameRegistry.TryGetValue(name, out var materialRef))
        {
            return(materialRef.CloneRef());
        }

        try {
            var mdfContent  = _fs.ReadTextFile(name);
            var parser      = new MdfParser(name, mdfContent);
            var mdfMaterial = parser.Parse();
            customizer?.Invoke(mdfMaterial);

            Trace.Assert(_nextFreeId >= 1);
            // Assign ID
            var id = _nextFreeId++;

            var material = CreateDeviceMaterial(name, mdfMaterial);

            using var result = new ResourceRef <IMdfRenderMaterial>(
                      new MdfRenderMaterial(id, name, mdfMaterial, material)
                      );

            mIdRegistry[id] = result.CloneRef();
            if (customizer == null)
            {
                mNameRegistry[nameLower] = result.CloneRef();
            }

            return(result.CloneRef());
        } catch (Exception e) {
            Logger.Error("Unable to load MDF file '{0}': {1} {2}", name, e.GetType(), e.Message);
            return(new ResourceRef <IMdfRenderMaterial>(InvalidMdfRenderMaterial.Instance));
        }
    }