29 this.rootUrl =
'https://api.matlib.gpuopen.com/api';
30 this.url = `${this.rootUrl}/materials`;
31 this.packageUrl = `${this.rootUrl}/packages`;
32 this.materials =
null;
33 this.materialNames =
null;
36 this.logger = console;
42 loadMaterialsFromCache() {
43 if (fs.existsSync(MATERIALS_CACHE_FILE)) {
45 const data = fs.readFileSync(MATERIALS_CACHE_FILE,
'utf8');
46 this.materials = JSON.parse(data);
48 this.materialNames = [];
49 for (
const jsonData of this.materials) {
50 for (
const material of jsonData.results) {
51 this.materialNames.push(material[
'title']);
54 this.logger.info(`Loaded GPUOpen materials from cache: ${MATERIALS_CACHE_FILE}`);
56 this.logger.warn(`Failed to load GPUOpen materials cache: ${e.message}`);
59 if (fs.existsSync(MATERIALS_PREVIEW_FILE)) {
61 const data = fs.readFileSync(MATERIALS_PREVIEW_FILE,
'utf8');
62 this.previews = JSON.parse(data);
63 this.logger.info(`Loaded GPUOpen material previews from cache: ${MATERIALS_PREVIEW_FILE}`);
65 this.logger.warn(`Failed to load GPUOpen material previews cache: ${e.message}`);
77 fs.writeFileSync(MATERIALS_CACHE_FILE, JSON.stringify(
this.materials,
null, 2));
78 this.logger.info(`Saved GPUOpen materials to cache: ${MATERIALS_CACHE_FILE}`);
80 this.logger.warn(`Failed to write GPUOpen materials cache: ${e.message}`);
82 return this.materials;
92 fs.writeFileSync(MATERIALS_PREVIEW_FILE, JSON.stringify(
this.previews,
null, 2));
93 this.logger.info(`Saved GPUOpen material previews to cache: ${MATERIALS_PREVIEW_FILE}`);
95 this.logger.warn(`Failed to write GPUOpen material previews cache: ${e.message}`);
105 return this.materialNames;
108 async getPreviews() {
111 if (fs.existsSync(MATERIALS_PREVIEW_FILE)) {
113 const data = fs.readFileSync(MATERIALS_PREVIEW_FILE,
'utf8');
115 this.previews = JSON.parse(data);
116 this.logger.info(`Loaded GPUOpen material previews from cache 2: ${MATERIALS_PREVIEW_FILE}`);
118 return this.previews;
120 this.logger.warn(`Failed to load GPUOpen material previews cache: ${e.message}`);
124 this.logger.info(`No GPUOpen material previews cache found.`);
127 return this.previews;
137 if (fs.existsSync(MATERIALS_CACHE_FILE)) {
139 const data = fs.readFileSync(MATERIALS_CACHE_FILE,
'utf8');
140 this.materials = JSON.parse(data);
142 this.materialNames = [];
143 for (
const jsonData of this.materials) {
144 for (
const material of jsonData.results) {
145 this.materialNames.push(material[
'title']);
148 this.logger.info(`Loaded GPUOpen materials from cache 2: ${MATERIALS_CACHE_FILE}`);
149 return this.materials;
151 this.logger.warn(`Failed to load GPUOpen materials cache: ${e.message}`);
157 this.materialNames = [];
160 let params =
new URLSearchParams({
165 url +=
'?' + params.toString();
168 let haveMoreMaterials =
true;
169 while (haveMoreMaterials) {
171 console.log(
'Fetch materials from url:', url);
172 const response = await fetch(url);
174 throw new Error(`HTTP error! status: ${response.status}`);
176 const jsonData = await response.json();
177 this.materials.push(jsonData);
178 for (
const material of jsonData.results) {
179 this.materialNames.push(material[
'title']);
181 let nextURL = jsonData.next;
184 haveMoreMaterials =
true;
186 console.log(
'Finished fetching materials');
187 haveMoreMaterials =
false;
191 this.logger.info(`Error: ${error.message}`);
192 haveMoreMaterials =
true;
197 fs.writeFileSync(MATERIALS_CACHE_FILE, JSON.stringify(
this.materials,
null, 2));
198 this.logger.info(`Saved GPUOpen materials to cache: ${MATERIALS_CACHE_FILE}`);
200 this.logger.warn(`Failed to write GPUOpen materials cache: ${e.message}`);
202 return this.materials;
205 async downloadPackage(listNumber, materialNumber, packageId = 0) {
206 if (this.materials ===
null || this.materials.length === 0) {
210 const jsonData = this.materials[listNumber];
215 let jsonResults =
null;
216 let jsonResult =
null;
217 if (
'results' in jsonData) {
218 jsonResults = jsonData[
'results'];
219 if (jsonResults.length <= materialNumber) {
222 jsonResult = jsonResults[materialNumber];
230 let jsonPackages =
null;
231 if (
'packages' in jsonResult) {
232 jsonPackages = jsonResult[
'packages'];
238 if (jsonPackages.length <= packageId) {
241 const packageIdValue = jsonPackages[packageId];
243 if (!packageIdValue) {
247 const url = `${this.packageUrl}/${packageIdValue}/download`
248 const response = await fetch(url);
249 const data = await response.arrayBuffer();
250 const title = jsonResult[
'title'];
252 console.log(`- Loader: Downloaded package: ${title} from ${url}`);
253 return [data, title];
264 if (!this.materials) {
268 const materialsList = [];
272 const regex =
new RegExp(materialName,
'i');
274 this.materials.forEach((materialList, materialIndex) => {
275 let materialNumber = 0;
277 materialList[
'results'].forEach((material) => {
280 if (regex.test(material[
'title'])) {
282 listNumber: listNumber,
283 materialNumber: materialNumber,
284 title: material[
'title'],
293 return materialsList;
305 const downloadList = [];
308 if (foundList.length > 0) {
309 for (
const found of foundList) {
310 const listNumber = found[
'listNumber'];
311 const materialNumber = found[
'materialNumber'];
312 const matName = found[
'title'];
313 this.logger.info(`> Download material: ${matName} List: ${listNumber}. Index: ${materialNumber}`);
314 const [data, title] = await this.downloadPackage(listNumber, materialNumber, packageId);
315 downloadList.push([data, title]);