Advertisement
lignite0

ROBO24 - chunk descriptor

Oct 21st, 2019
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function generateOffset(start = 0) {
  2.     let counter = start;
  3.     return function (size) {
  4.         const offset = counter;
  5.         counter += number;
  6.         return {
  7.             offset,
  8.             size,
  9.         };
  10.     }
  11. }
  12.  
  13. const createStaticDescription = function (dataViewType) {
  14.     const getterName = `get${dataViewType}`;
  15.     const setterName = `set${dataViewType}`;
  16.     return function (offset) {
  17.         offset = parseInt(offset);
  18.         if (isNaN(offset)) {
  19.             throw new Error("Static descriptor must have valid offset");
  20.         }
  21.         return {
  22.             get: function () {
  23.                 return this['dataView'][getterName](offset);
  24.             },
  25.             set: function (value) {
  26.                 this['dataView'][setterName](offset, value);
  27.             },
  28.             writable: true,
  29.         }
  30.     }
  31. };
  32.  
  33. const mapper = {
  34.     "s16": "Int16",
  35.     "u16": "Uint16",
  36. };
  37.  
  38. const createVectorDescription = function (fields, size, dataViewType) {
  39.     return function (offset) {
  40.         offset = parseInt(offset);
  41.         if (isNaN(offset)) {
  42.             throw new Error("Vector descriptor must have valid offset");
  43.         }
  44.         const object = {};
  45.         for (let [key, field] of fields.entries()) {
  46.             let subOffset = offset + (size * key);
  47.             Object.defineProperty(object, key, createStaticDescription(dataViewType, subOffset));
  48.             Object.defineProperty(object, field, createStaticDescription(dataViewType, subOffset));
  49.         }
  50.         return {
  51.             value: object,
  52.             writable: false,
  53.         };
  54.     }
  55. };
  56.  
  57. const types = Object.create(null);
  58.  
  59. const numberTypes = [];
  60. for (let signed of ["s", "u"]) {
  61.     for (let i = 0; i < 4; i++) {
  62.         const size = 2 ** i;
  63.         const name = `${signed}${size * 8}`;
  64.         const numberType = {
  65.             name,
  66.             size,
  67.             define: createStaticDescription(type),
  68.         };
  69.         numberTypes.push(numberType);
  70.         types[name] = numberType;
  71.     }
  72. }
  73.  
  74. const vectorDirections = [
  75.     ["x", "y"],
  76.     ["x", "y", "z"],
  77.     ["x", "y", "z", "w"],
  78. ];
  79.  
  80. for (let directions of vectorDirections) {
  81.     for (let {name: numberTypeName, size: numberTypeSize} of numberTypes) {
  82.         const name = `vec${directions.length}<${numberTypeName}>`;
  83.         const size = directions.length * numberTypeSize;
  84.         types[name] = {
  85.             name,
  86.             size,
  87.             define: createVectorDescription(directions, numberTypeSize, numberTypeName)
  88.         }
  89.     }
  90. }
  91.  
  92. types['blob'] = {
  93.     name: 'blob',
  94.     size: undefined,
  95. };
  96.  
  97. const regex = new RegExp(`(?<mainType>\\w+)(?:<(?<subtype>\\w+)>)?(?:\\[(?<count>\\w*)\\])?`);
  98.  
  99. const defineDecors = function () {
  100.     let offset = 0;
  101.     for (let decoder of this['decoder'].fields) {
  102.         const {type, field} = decoder;
  103.         const match = regex.exec(type);
  104.         const {type, subtype, count} = match.groups;
  105.         const key = `${type}<${subtype}>`;
  106.         const typeDefinition = types[key];
  107.         const descriptor = typeDefinition.define(offset);
  108.         const next = parseInt(typeDefinition.size);
  109.         if (isNaN(next)) {
  110.  
  111.         }
  112.  
  113.         offset += typeDefinition.size;
  114.             Object.defineProperty(this, field, descriptor);
  115.     }
  116. };
  117.  
  118. export default class Chunk {
  119.  
  120.     constructor(options) {
  121.         this.dataView = options['dataView'];
  122.         defineDecors.call(this);
  123.     }
  124. }
  125.  
  126. const size = generateOffset();
  127.  
  128. const generateBlob = (key) => ({
  129.     field: key,
  130.     type: "blob",
  131.     offset: function () {
  132.         return this[`${key}Offset`];
  133.     },
  134.     size: function () {
  135.         return this[`${key}Size`];
  136.     }
  137. });
  138.  
  139. const generateBlob = (key) => ({
  140.     type: "blob",
  141.     field: key,
  142.     offset: function () {
  143.         return this[`${key}Offset`];
  144.     },
  145.     size: function () {
  146.         return this[`${key}Size`];
  147.     }
  148. });
  149.  
  150. Chunk.prototype['decoder'] = {
  151.     fields: [
  152.         {type: "u8", field: "type"},
  153.         {type: "u8", field: "blockBitWidth"},
  154.         {type: "vec3<u16>", field: "position"},
  155.         {type: "u16", field: "blockDataOffset"},
  156.         {type: "u16", field: "blockIndexDataOffset"},
  157.         {type: "u16", field: "terrainDataOffset"},
  158.         {type: "u16", field: "additionalDataOffset"},
  159.         {type: "u16", field: "overrideDataOffset"},
  160.         {type: "u16", field: "blockDataSize"},
  161.         {type: "u16", field: "blockIndexDataSize"},
  162.         {type: "u16", field: "terrainDataSize"},
  163.         {type: "u16", field: "additionalDataSize"},
  164.         {type: "u16", field: "overrideDataSize"},
  165.         generateBlob('blockData'),
  166.         generateBlob('blockIndexData'),
  167.         generateBlob('terrainData'),
  168.         generateBlob('additionalData'),
  169.         generateBlob('overrideData'),
  170.     ],
  171. };
  172.  
  173. const buffer = new ArrayBuffer(4096);
  174. const dataView = new DataView(buffer, 2048);
  175. dataView.setInt16(0, 5);
  176.  
  177. const chunk = new Chunk(dataView);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement