XB PointStream/custom parsers
Parser Interface
Intro
Currently XBPS only supports reading .ASC file types. If you require the library to render other files, you will need to write a custom parser and register it with the library. This should not be difficult, there are only a few things your parser must implement.
Example
Here is an example which you can use to help understand the process: [link here]
Parser Skeleton
The following bit of code is a skeleton which you can use as an aid to help you write your own parser for XB PointStream.
var Your_Parser_Name = (function() { /* XBPS will create an instance of your parser and pass in an object with three named properties: start - must occur exactly once. When you call this function, pass in a reference to your parser end - must occur exactly once. When you call this function, pass in a reference to your parser parse - may occur one or many times. When you call this function, pass in a reference to your parser as the first argument and an object as the second argument. This second object must have variables referencing typed single-dimensional arrays which contain the parsed values. For example, if vertsArray and colsArray were Float32Array arrays, you would call the parse function like this: var attributes = {}; attributes["ps_Vertex"] = vertsArray; attributes["ps_Color"] = colsArray; parse(thisParser, attributes); PointStream will create buffers using these values and start rendering them using the built-in shaders. Notice the variable names have been qualified with "ps_". If you are using the XB PointStream built-in shaders, you will need to use these exact variable names. These are the only two variables the built-in shaders read. If your parser reads in vertex normal data, you will need to write your own shaders to handle lighting. */ function Your_Parser_Name(config) { /*Returns the version of this parser.*/ this.__defineGetter__("version", function(){return /*!!*/;}); /*Get the number of parsed points so far.*/ this.__defineGetter__("numParsedPoints", function(){return /*!!*/;}); /*Get the total number of points in the point cloud.*/ this.__defineGetter__("numTotalPoints", function(){return /*!!*/;}); /*Returns the progress of downloading the point cloud between zero and one.*/ this.__defineGetter__("progress", function(){return /*!!*/;}); /*Returns the file size of the resource in bytes.*/ this.__defineGetter__("fileSize", function(){return /*!!*/;}); /*Path = path to the resource */ this.load = function(path){/*!!*/}; } return Your_Parser_Name; }());
/* The following example demonstrates how XBPS might use a particular parser. */ var parser; function startCallback(parser){ // started } function parseCallback(parser, attributes){ parser.version; parser.numParsedPoints; parser.numTotalPoints; parser.progress; parser.fileSize; } function finishCallback(parser){ // finished } // create a hypothetical parser and set the callbacks parser = new Your_Parser_Name({ start: startCallback, parse: parseCallback, end: finishCallback}); // load some resource parser.load("pointcloud.xyz");