@@ -49,7 +49,7 @@ | |||
%token T_TRANSLATEX T_ROTATEX T_TAPERX T_TWISTX T_SHEARX T_STRETCHX T_BENDXY T_BENDXZ T_SCALEX T_MIRRORX | |||
%token T_TRANSLATEY T_ROTATEY T_TAPERY T_TWISTY T_SHEARY T_STRETCHY T_BENDYX T_BENDYZ T_SCALEY T_MIRRORY | |||
%token T_TRANSLATEZ T_ROTATEZ T_TAPERZ T_TWISTZ T_SHEARZ T_STRETCHZ T_BENDZX T_BENDZY T_SCALEZ T_MIRRORZ | |||
%token T_TRANSLATE T_SCALE T_TOGGLESCALEWINDING T_RADIALJITTER T_SPLITTRIANGLE T_SMOOTHMESH | |||
%token T_TRANSLATE T_ROTATE T_SCALE T_TOGGLESCALEWINDING T_RADIALJITTER T_SPLITTRIANGLE T_SMOOTHMESH | |||
%token T_CSGUNION T_CSGSUBSTRACT T_CSGSUBSTRACTLOSS T_CSGAND T_CSGXOR | |||
%token T_CHAMFER | |||
@@ -101,14 +101,6 @@ mesh_expression: | |||
| mesh_open mesh_expression_list mesh_close | |||
; | |||
mesh_open: | |||
'[' { mc.m_mesh.OpenBrace(); } | |||
; | |||
mesh_close: | |||
']' { mc.m_mesh.CloseBrace(); } | |||
; | |||
mesh_command_list: | |||
mesh_command | |||
| mesh_command_list mesh_command | |||
@@ -118,6 +110,23 @@ mesh_command: | |||
color_command | |||
| transform_command | |||
| primitive_command | |||
| csg_command | |||
; | |||
csg_command: | |||
T_CSGUNION { mc.m_mesh.CsgUnion(); } | |||
| T_CSGSUBSTRACT { mc.m_mesh.CsgSubstract(); } | |||
| T_CSGSUBSTRACTLOSS { mc.m_mesh.CsgSubstractLoss(); } | |||
| T_CSGAND { mc.m_mesh.CsgAnd(); } | |||
| T_CSGXOR { mc.m_mesh.CsgXor(); } | |||
; | |||
mesh_open: | |||
'[' { mc.m_mesh.OpenBrace(); } | |||
; | |||
mesh_close: | |||
']' { mc.m_mesh.CloseBrace(); } | |||
; | |||
color_command: | |||
@@ -126,16 +135,15 @@ color_command: | |||
| T_COLOR COLOR { uint32_t x = $2; | |||
ivec4 v(x >> 24, (x >> 16) & 0xff, (x >> 8) & 0xff, x & 0xff); | |||
mc.m_mesh.SetCurColor(vec4(v) * (1.f / 255.f)); } | |||
| T_BGCOLOR fv fv fv fv { mc.m_mesh.SetCurColor2(vec4($2, $3, $4, $5)); } | |||
| T_BGCOLOR v4 { mc.m_mesh.SetCurColor2(vec4($2[0], $2[1], $2[2], $2[3])); } | |||
| T_BGCOLOR COLOR { uint32_t x = $2; | |||
| T_BCOLOR fv fv fv fv { mc.m_mesh.SetCurColor2(vec4($2, $3, $4, $5)); } | |||
| T_BCOLOR v4 { mc.m_mesh.SetCurColor2(vec4($2[0], $2[1], $2[2], $2[3])); } | |||
| T_BCOLOR COLOR { uint32_t x = $2; | |||
ivec4 v(x >> 24, (x >> 16) & 0xff, (x >> 8) & 0xff, x & 0xff); | |||
mc.m_mesh.SetCurColor2(vec4(v) * (1.f / 255.f)); } | |||
; | |||
transform_command: | |||
T_CHAMFER fv { mc.m_mesh.Chamfer($2); } | |||
| T_TRANSLATEX fv { mc.m_mesh.Translate(vec3($2, 0.f, 0.f)); } | |||
T_TRANSLATEX fv { mc.m_mesh.Translate(vec3($2, 0.f, 0.f)); } | |||
| T_TRANSLATEY fv { mc.m_mesh.Translate(vec3(0.f, $2, 0.f)); } | |||
| T_TRANSLATEZ fv { mc.m_mesh.Translate(vec3(0.f, 0.f, $2)); } | |||
| T_TRANSLATE fv fv fv { mc.m_mesh.Translate(vec3($2, $3, $4)); } | |||
@@ -143,6 +151,9 @@ transform_command: | |||
| T_ROTATEX fv { mc.m_mesh.RotateX($2); } | |||
| T_ROTATEY fv { mc.m_mesh.RotateY($2); } | |||
| T_ROTATEZ fv { mc.m_mesh.RotateZ($2); } | |||
| T_ROTATE fv fv fv fv { mc.m_mesh.RotateZ($2, vec3($3, $4, $5)); } | |||
| T_ROTATE fv vec3 { mc.m_mesh.RotateZ($2, vec3($3[0], $3[1], $3[2])); } | |||
| T_RADIALJITTER fv { mc.m_mesh.RadialJitter($2); } | |||
| T_TAPERX fv fv fv bv { mc.m_mesh.TaperX($2, $3, $4, $5); } | |||
| T_TAPERX fv fv fv { mc.m_mesh.TaperX($2, $3, $4); } | |||
| T_TAPERX fv fv { mc.m_mesh.TaperX($2, $3); } | |||
@@ -194,15 +205,10 @@ transform_command: | |||
| T_MIRRORX { mc.m_mesh.MirrorX(); } | |||
| T_MIRRORY { mc.m_mesh.MirrorY(); } | |||
| T_MIRRORZ { mc.m_mesh.MirrorZ(); } | |||
| T_RADIALJITTER fv { mc.m_mesh.RadialJitter($2); } | |||
| T_CHAMFER fv { mc.m_mesh.Chamfer($2); } | |||
| T_SPLITTRIANGLE iv { mc.m_mesh.SplitTriangles($2); } | |||
| T_SMOOTHMESH iv iv iv { mc.m_mesh.SmoothMesh($2, $3, $4); } | |||
| T_TOGGLESCALEWINDING { mc.m_mesh.ToggleScaleWinding(); } | |||
| T_CSGUNION { mc.m_mesh.CsgUnion(); } | |||
| T_CSGSUBSTRACT { mc.m_mesh.CsgSubstract(); } | |||
| T_CSGSUBSTRACTLOSS { mc.m_mesh.CsgSubstractLoss(); } | |||
| T_CSGAND { mc.m_mesh.CsgAnd(); } | |||
| T_CSGXOR { mc.m_mesh.CsgXor(); } | |||
; | |||
primitive_command: | |||
@@ -210,6 +216,9 @@ primitive_command: | |||
| T_CYLINDER iv fv fv fv bv bv { mc.m_mesh.AppendCylinder($2, $3, $4, $5, $6, $7); } | |||
| T_CYLINDER iv fv fv fv bv { mc.m_mesh.AppendCylinder($2, $3, $4, $5, $6); } | |||
| T_CYLINDER iv fv fv fv { mc.m_mesh.AppendCylinder($2, $3, $4, $5); } | |||
| T_SPHERE iv fv { mc.m_mesh.AppendSphere($2, $3); } | |||
| T_CAPSULE iv fv fv { mc.m_mesh.AppendCapsule($2, $3, $4); } | |||
| T_TORUS iv fv fv { mc.m_mesh.AppendTorus($2, $3, $4); } | |||
| T_BOX fv fv fv fv { mc.m_mesh.AppendBox(vec3($2, $3, $4), $5); } | |||
| T_BOX fv fv fv { mc.m_mesh.AppendBox(vec3($2, $3, $4)); } | |||
| T_BOX fv { mc.m_mesh.AppendBox(vec3($2, $2, $2)); } | |||
@@ -221,14 +230,12 @@ primitive_command: | |||
| T_FLATCHAMFBOX fv fv fv fv { mc.m_mesh.AppendFlatChamfBox(vec3($2, $3, $4), $5); } | |||
| T_FLATCHAMFBOX fv fv { mc.m_mesh.AppendFlatChamfBox(vec3($2, $2, $2), $3); } | |||
| T_FLATCHAMFBOX v3 fv { mc.m_mesh.AppendFlatChamfBox(vec3($2[0], $2[1], $2[2]), $3); } | |||
| T_SPHERE iv fv { mc.m_mesh.AppendSphere($2, $3); } | |||
| T_CAPSULE iv fv fv { mc.m_mesh.AppendCapsule($2, $3, $4); } | |||
| T_TORUS iv fv fv { mc.m_mesh.AppendTorus($2, $3, $4); } | |||
| T_STAR iv fv fv bv bv { mc.m_mesh.AppendStar($2, $3, $4, $5, $6); } | |||
| T_STAR iv fv fv bv { mc.m_mesh.AppendStar($2, $3, $4, $5); } | |||
| T_STAR iv fv fv { mc.m_mesh.AppendStar($2, $3, $4); } | |||
| T_EXPANDEDSTAR iv fv fv fv { mc.m_mesh.AppendExpandedStar($2, $3, $4, $5); } | |||
| T_EXPANDEDSTAR iv fv fv { mc.m_mesh.AppendExpandedStar($2, $3, $4); } | |||
| T_DISC iv fv bv { mc.m_mesh.AppendDisc($2, $3, $4); } | |||
| T_DISC iv fv { mc.m_mesh.AppendDisc($2, $3); } | |||
| T_TRIANGLE fv bv { mc.m_mesh.AppendSimpleTriangle($2, $3); } | |||
@@ -47,10 +47,16 @@ typedef lol::EasyMeshParser::token_type token_type; | |||
yylloc->step(); | |||
%} | |||
(csgu|csgunion) { return token::T_CSGUNION; } | |||
(csgs|csgsubstract) { return token::T_CSGSUBSTRACT; } | |||
(csgsl|csgsubstractloss) { return token::T_CSGSUBSTRACTLOSS; } | |||
(csga|csgand) { return token::T_CSGAND; } | |||
(csgx|csgxor) { return token::T_CSGXOR; } | |||
(tsw|scalewinding) { return token::T_TOGGLESCALEWINDING; } | |||
(sc|setcolor) { return token::T_COLOR; } | |||
(scb|setbgcolor) { return token::T_BGCOLOR; } | |||
(scb|setbcolor) { return token::T_BCOLOR; } | |||
(ch|chamfer) { return token::T_CHAMFER; } | |||
(tx|translatex) { return token::T_TRANSLATEX; } | |||
(ty|translatey) { return token::T_TRANSLATEY; } | |||
(tz|translatez) { return token::T_TRANSLATEZ; } | |||
@@ -58,6 +64,8 @@ typedef lol::EasyMeshParser::token_type token_type; | |||
(rx|rotatex) { return token::T_ROTATEX; } | |||
(ry|rotatey) { return token::T_ROTATEY; } | |||
(rz|rotatez) { return token::T_ROTATEZ; } | |||
(r|rotate) { return token::T_ROTATE; } | |||
(rj|radialjitter) { return token::T_RADIALJITTER; } | |||
(tax|taperx) { return token::T_TAPERX; } | |||
(tay|tapery) { return token::T_TAPERY; } | |||
(taz|taperz) { return token::T_TAPERZ; } | |||
@@ -80,33 +88,26 @@ typedef lol::EasyMeshParser::token_type token_type; | |||
(sy|scaley) { return token::T_SCALEY; } | |||
(sz|scalez) { return token::T_SCALEZ; } | |||
(s|scale) { return token::T_SCALE; } | |||
(tsw|scalewinding) { return token::T_TOGGLESCALEWINDING; } | |||
(mx|mirrorx) { return token::T_MIRRORX; } | |||
(my|mirrory) { return token::T_MIRRORY; } | |||
(mz|mirrorz) { return token::T_MIRRORZ; } | |||
(rj|radialjitter) { return token::T_RADIALJITTER; } | |||
(ch|chamfer) { return token::T_CHAMFER; } | |||
(splt|splittriangle) { return token::T_SPLITTRIANGLE; } | |||
(smth|smooth) { return token::T_SMOOTHMESH; } | |||
(csgu|csgunion) { return token::T_CSGUNION; } | |||
(csgs|csgsubstract) { return token::T_CSGSUBSTRACT; } | |||
(csgsl|csgsubstractloss) { return token::T_CSGSUBSTRACTLOSS; } | |||
(csga|csgand) { return token::T_CSGAND; } | |||
(csgx|csgxor) { return token::T_CSGXOR; } | |||
(ab|addbox) { return token::T_BOX; } | |||
(ac|addcylinder) { return token::T_CYLINDER; } | |||
(asph|addsphere) { return token::T_SPHERE; } | |||
(acap|addcapsule) { return token::T_CAPSULE; } | |||
(acg|addcog) { return token::T_COG; } | |||
(ad|adddisc) { return token::T_DISC; } | |||
(aes|addexpandedstar) { return token::T_EXPANDEDSTAR; } | |||
(ato|addtorus) { return token::T_TORUS; } | |||
(ab|addbox) { return token::T_BOX; } | |||
(ascb|addsmoothchamfbox) { return token::T_SMOOTHCHAMFBOX; } | |||
(afcb|addflatchamfbox) { return token::T_FLATCHAMFBOX; } | |||
(aq|addquad) { return token::T_QUAD; } | |||
(as|addstar) { return token::T_STAR; } | |||
(ascb|addsmoothchamfbox) { return token::T_SMOOTHCHAMFBOX; } | |||
(asph|adsphere) { return token::T_SPHERE; } | |||
(aes|addexpandedstar) { return token::T_EXPANDEDSTAR; } | |||
(ad|adddisc) { return token::T_DISC; } | |||
(at|addtriangle) { return token::T_TRIANGLE; } | |||
(ato|addtorus) { return token::T_TORUS; } | |||
(aq|addquad) { return token::T_QUAD; } | |||
(acg|addcog) { return token::T_COG; } | |||
%{ /* ======= BASE DATA TYPES ========================================= */ %} | |||
%{ /* COLOR */ %} | |||
@@ -558,22 +558,25 @@ public: | |||
/* [cmd:csgx] Performs a Xor operation as (m0_Outside/m0_Inside-inverted + m1_Outside/m1_Inside-inverted) */ | |||
void CsgXor() { MeshCsg(CSGUsage::Xor); } | |||
//------------------------------------------------------------------------- | |||
//Mesh Base operations | |||
//------------------------------------------------------------------------- | |||
public: | |||
/* [cmd:[] from this point onward, any operation will not be performed on previous vertices */ | |||
void OpenBrace(); | |||
/* [cmd:]] Merge current vertices with previous context */ | |||
void CloseBrace(); | |||
/* [cmd:tsw] When activation, on negative-scaling, normal fixing will not occur */ | |||
/* [cmd:tsw] When activated, on negative-scaling, normal-vector correction will not occur */ | |||
void ToggleScaleWinding(); | |||
/* [cmd:sc] Set vertices color */ | |||
/* [cmd:sc] Set base color */ | |||
void SetCurColor(vec4 const &color); | |||
/* [cmd:scb] Set vertices color 2 */ | |||
/* [cmd:scb] Set base color 2 */ | |||
void SetCurColor2(vec4 const &color); | |||
private: | |||
//------------------------------------------------------------------------- | |||
//Internal : Basic triangle/vertex operations | |||
//------------------------------------------------------------------------- | |||
private: | |||
void AddVertex(vec3 const &coord); | |||
void AddDuplicateVertex(int i); | |||
void AddLerpVertex(int i, int j, float alpha); | |||
@@ -586,8 +589,9 @@ public: //DEBUG | |||
void ComputeTexCoord(float uv_scale, int uv_offset); | |||
//------------------------------------------------------------------------- | |||
//Vertices operations | |||
//Internal : Vertices operations | |||
//------------------------------------------------------------------------- | |||
private: | |||
void SetVertColor(vec4 const &color); | |||
void SetTexCoordData(vec2 const &new_offset, vec2 const &new_scale); | |||
void SetTexCoordData2(vec2 const &new_offset, vec2 const &new_scale); | |||
@@ -617,11 +621,11 @@ public: | |||
- axis : rotation axis. | |||
*/ | |||
void Rotate(float angle, vec3 const &axis); | |||
/* [cmd:rj] Randomly move vertices along Origin-to-vertex as o2v *= (1.0 + rand(r)) | |||
/* [cmd:rj] Randomly move vertices along Origin-to-vertex as f(vtx) = vtx + o2v * (1.0 + rand(r)) | |||
- r : jitter maximum value. | |||
*/ | |||
void RadialJitter(float r); | |||
/* [cmd:tax] multiply axis y&z by x as y *= (1.0 + (ny * x + xoff)) | |||
/* [cmd:tax] multiply axis y&z by x as f(y) = y * (1.0 + (ny * x + xoff)) | |||
- ny : value of n for y. | |||
- nz : value of n for z. | |||
- xoff : value of xoff. | |||
@@ -632,7 +636,7 @@ public: | |||
void TaperY(float nx, float nz, float yoff=0.f, bool absolute=true); | |||
/* [cmd:taz] Same as TaperX, with Z */ | |||
void TaperZ(float nx, float ny, float zoff=0.f, bool absolute=true); | |||
/* [cmd:twx] Twist vertices around x axis with x as rotation value as p = (RotateX(x * t + toff) * p) | |||
/* [cmd:twx] Twist vertices around x axis with x as rotation value as f(p) = (RotateX(x * t + toff) * p) | |||
- t : Angle multiplier. | |||
- toff : Applied offset. | |||
*/ | |||
@@ -641,7 +645,7 @@ public: | |||
void TwistY(float t, float toff=0.f); | |||
/* [cmd:twz] Same as TwistX, with Z */ | |||
void TwistZ(float t, float toff=0.f); | |||
/* [cmd:shx] Shear vertices using x value as shear quantity as y += (ny * x + xoff) | |||
/* [cmd:shx] Shear vertices using x value as shear quantity as f(y) = y + (ny * x + xoff) | |||
- ny : Value of n for y. | |||
- nz : Value of n for z. | |||
- xoff : Value of xoff. | |||
@@ -652,7 +656,7 @@ public: | |||
void ShearY(float nx, float nz, float yoff=0.f, bool absolute=true); | |||
/* [cmd:shz] Same as ShearX, with Z */ | |||
void ShearZ(float nx, float ny, float zoff=0.f, bool absolute=true); | |||
/* [cmd:stx] Stretch vertices using x value as stretch quantity as y += (pow(x, ny) + xoff) | |||
/* [cmd:stx] Stretch vertices using x value as stretch quantity as f(y) = y + (pow(x, ny) + xoff) | |||
- ny : Value of n for y. | |||
- nz : Value of n for z. | |||
- xoff : Value of xoff. | |||
@@ -662,7 +666,7 @@ public: | |||
void StretchY(float nx, float nz, float yoff=0.f); | |||
/* [cmd:stz] Same as StretchX, with Z */ | |||
void StretchZ(float nx, float ny, float zoff=0.f); | |||
/* [cmd:bdxy] Bend vertices using x as bend quantity along y axis using p = (RotateY(x * t + toff) * p) | |||
/* [cmd:bdxy] Bend vertices using x as bend quantity along y axis using f(p) = (RotateY(x * t + toff) * p) | |||
- t : Angle multiplier. | |||
- xoff : Applied offset. | |||
*/ | |||
@@ -716,11 +720,11 @@ public: | |||
Acts as an OpenBrace | |||
*/ | |||
void DupAndScale(vec3 const &s); | |||
/* [cmd:ch] Performs a chamfer operation //TODO : Make it work. | |||
/* [cmd:ch] Performs a chamfer operation //TODO : Make it work | |||
- f : Chamfer quantity. | |||
*/ | |||
void Chamfer(float f); | |||
/* [cmd:splt] split triangles in 4 smaller ones. | |||
/* [cmd:splt] split triangles in 4 smaller ones | |||
- pass : Number of pass applied. | |||
*/ | |||
void SplitTriangles(int pass); | |||
@@ -728,11 +732,11 @@ private: | |||
void SplitTriangles(int pass, VertexDictionnary *vert_dict); | |||
public: | |||
/* [cmd:smth] Smooth the mesh by subdivising it. | |||
- main_pass : a main pass is made of (n0 split then n1 smooth) repeat. | |||
- split_per_main_pass : n0 value in above explanation. | |||
- smooth_per_main_pass : n1 value in above explanation. | |||
- pass : a pass is made of (n0 split then n1 smooth) repeat. | |||
- split_per_pass : n0 value in above explanation. | |||
- smooth_per_pass : n1 value in above explanation. | |||
*/ | |||
void SmoothMesh(int main_pass, int split_per_main_pass, int smooth_per_main_pass); | |||
void SmoothMesh(int pass, int split_per_pass, int smooth_per_pass); | |||
//------------------------------------------------------------------------- | |||
//Mesh shape operations | |||
@@ -769,7 +773,6 @@ public: | |||
/* [cmd:ab] Box centered on (0,0,0) with BBox [-.5 * size][.5 * size] | |||
- size : size of the box. | |||
- chamf : size of the chamfer. | |||
- smooth : if (true) will smooth normals : TOOD:TOREMOVE : smooth should be handled elsewhere | |||
*/ | |||
void AppendBox(vec3 const &size, float chamf=0.f); | |||
//Same as AppendBox | |||
@@ -0,0 +1,91 @@ | |||
//------------------------------------------------------------------------- | |||
//Command vars operations | |||
//------------------------------------------------------------------------- | |||
CmdVar("float", ["Fraction value", "0.0"]); | |||
CmdVar("int", ["No decimal value", "0"]); | |||
CmdVar("bool", ["Boolean value", "true/false", "1/0"]); | |||
CmdVar("color", ["Red/Green/Blue/{Alpha}", | |||
"HEXA: #ABC{D}", " #AABBCC{DD}", | |||
"FLOAT: f f f f", " (f f f f)", " (f)"]); | |||
CmdVar("vec3", ["X/Y/Z as float", " f f f", "(f f f)", "(f)"]); | |||
//------------------------------------------------------------------------- | |||
//Mesh CSG operations | |||
//------------------------------------------------------------------------- | |||
CmdType(["csgu", "csgunion"], "Performs a Union operation as (mesh0_Outside + mesh1_Outside)"); | |||
CmdType(["csgs", "csgsubstract"], "Performs a Substract operation as (mesh0_Outside + mesh1_Inside-inverted)"); | |||
CmdType(["csgsl", "csgsubstractloss"], "Performs a Substract operation without keeping the mesh1 part"); | |||
CmdType(["csga", "csgand"], "Performs an And operation as (mesh0_Inside + mesh1_Inside)"); | |||
CmdType(["csgx", "csgxor"], "Performs a Xor operation as (m0_Outside/m0_Inside-inverted + m1_Outside/m1_Inside-inverted)"); | |||
//------------------------------------------------------------------------- | |||
//Mesh Base operations | |||
//------------------------------------------------------------------------- | |||
CmdType(["tsw", "scalewinding"], "When activated, on negative-scaling,\nnormal-vector correction will not occur"); | |||
CmdType(["sc", "setcolor"], "Set A color", [CmdArg("color", "color")]); | |||
CmdType(["scb", "setbgcolor"], "Set B color", [CmdArg("color", "color")]); | |||
//------------------------------------------------------------------------- | |||
//Mesh transform operations | |||
//------------------------------------------------------------------------- | |||
CmdType(["tx", "translatex"], "Translate vertices along the X axis", [CmdArg("float", "n")]); | |||
CmdType(["ty", "translatey"], "Translate vertices along the Y axis", [CmdArg("float", "n")]); | |||
CmdType(["tz", "translatez"], "Translate vertices along the Z axis", [CmdArg("float", "n")]); | |||
CmdType(["t", "translate"], "Translate vertices", [CmdArg("vec3", "v")]); | |||
CmdType(["rx", "rotatex"], "Rotate vertices along the X axis", [CmdArg("float", "degree")]); | |||
CmdType(["ry", "rotatey"], "Rotate vertices along the Y axis", [CmdArg("float", "degree")]); | |||
CmdType(["rz", "rotatez"], "Rotate vertices along the Z axis", [CmdArg("float", "degree")]); | |||
CmdType(["r", "rotate"], "Rotate vertices along the given axis", [CmdArg("float", "degree"), CmdArg("vec3", "axis")]); | |||
CmdType(["rj", "radialjitter"], "Randomly move vertices along Origin-to-vertex as f(vtx) = vtx + o2v * (1.0 + rand(r))", [CmdArg("float", "r")]); | |||
CmdType(["tax", "taperx"], "multiply axis y/z by f(x)\nf(z) = z * (1.0 + (nz * f(x) + xoff))\nf(x) = absolute ? abs_x : x", [CmdArg("float", "ny"), CmdArg("float", "nz"), CmdArg("float", "xoff", "0.0"), CmdArg("bool", "absolute", "true")]); | |||
CmdType(["tay", "tapery"], "multiply axis x/z by f(y)\nf(x) = x * (1.0 + (nx * f(y) + yoff))\nf(y) = absolute ? abs_y : y", [CmdArg("float", "nx"), CmdArg("float", "nz"), CmdArg("float", "yoff", "0.0"), CmdArg("bool", "absolute", "true")]); | |||
CmdType(["taz", "taperz"], "multiply axis x/y by f(z)\nf(y) = y * (1.0 + (ny * f(z) + zoff))\nf(z) = absolute ? abs_z : z", [CmdArg("float", "nx"), CmdArg("float", "ny"), CmdArg("float", "zoff", "0.0"), CmdArg("bool", "absolute", "true")]); | |||
CmdType(["twx", "twistx"], "Twist vertices around x axis with x as rotation value\nf(p) = (RotateX(x * t + toff) * p)", [CmdArg("float", "t"), CmdArg("float", "toff", "0.0")]); | |||
CmdType(["twy", "twisty"], "Twist vertices around y axis with y as rotation value\nf(p) = (RotateY(y * t + toff) * p)", [CmdArg("float", "t"), CmdArg("float", "toff", "0.0")]); | |||
CmdType(["twz", "twistz"], "Twist vertices around z axis with z as rotation value\nf(p) = (RotateZ(z * t + toff) * p)", [CmdArg("float", "t"), CmdArg("float", "toff", "0.0")]); | |||
CmdType(["shx", "shearx"], "Shear vertices using x value as shear quantity\nf(z) = z + (nz * f(x) + xoff)\nf(x) = absolute ? abs_x : x", [CmdArg("float", "ny"), CmdArg("float", "nz"), CmdArg("float", "xoff", "0.0"), CmdArg("bool", "absolute", "true")]); | |||
CmdType(["shy", "sheary"], "Shear vertices using y value as shear quantity\nf(x) = x + (nx * f(y) + yoff)\nf(y) = absolute ? abs_y : y", [CmdArg("float", "nx"), CmdArg("float", "nz"), CmdArg("float", "yoff", "0.0"), CmdArg("bool", "absolute", "true")]); | |||
CmdType(["shz", "shearz"], "Shear vertices using z value as shear quantity\nf(y) = y + (ny * f(z) + zoff)\nf(z) = absolute ? abs_z : z", [CmdArg("float", "nx"), CmdArg("float", "ny"), CmdArg("float", "zoff", "0.0"), CmdArg("bool", "absolute", "true")]); | |||
CmdType(["stx", "stretchx"], "Stretch vertices using x value as stretch quantity\nf(z) = z + (pow(x, nz) + xoff)", [CmdArg("float", "ny"), CmdArg("float", "nz"), CmdArg("float", "xoff", "0.0")]); | |||
CmdType(["sty", "stretchy"], "Stretch vertices using y value as stretch quantity\nf(x) = x + (pow(y, nx) + yoff)", [CmdArg("float", "nx"), CmdArg("float", "nz"), CmdArg("float", "yoff", "0.0")]); | |||
CmdType(["stz", "stretchz"], "Stretch vertices using z value as stretch quantity\nf(y) = y + (pow(z, ny) + zoff)", [CmdArg("float", "nx"), CmdArg("float", "ny"), CmdArg("float", "zoff", "0.0")]); | |||
CmdType(["bdxy", "bendxy"], "Bend vertices using x as bend quantity along y axis\nf(p) = (RotateY(x * t + toff) * p)", [CmdArg("float", "t"), CmdArg("float", "toff", "0.0")]); | |||
CmdType(["bdxz", "bendxz"], "Bend vertices using x as bend quantity along z axis\nf(p) = (RotateZ(x * t + toff) * p)", [CmdArg("float", "t"), CmdArg("float", "toff", "0.0")]); | |||
CmdType(["bdyx", "bendyx"], "Bend vertices using y as bend quantity along x axis\nf(p) = (RotateX(y * t + toff) * p)", [CmdArg("float", "t"), CmdArg("float", "toff", "0.0")]); | |||
CmdType(["bdyz", "bendyz"], "Bend vertices using y as bend quantity along z axis\nf(p) = (RotateZ(y * t + toff) * p)", [CmdArg("float", "t"), CmdArg("float", "toff", "0.0")]); | |||
CmdType(["bdzx", "bendzx"], "Bend vertices using z as bend quantity along x axis\nf(p) = (RotateX(z * t + toff) * p)", [CmdArg("float", "t"), CmdArg("float", "toff", "0.0")]); | |||
CmdType(["bdzy", "bendzy"], "Bend vertices using z as bend quantity along y axis\nf(p) = (RotateY(z * t + toff) * p)", [CmdArg("float", "t"), CmdArg("float", "toff", "0.0")]); | |||
CmdType(["sx", "scalex"], "Scale vertices", [CmdArg("vec3", "s")]); | |||
CmdType(["sy", "scaley"], "Scale vertices", [CmdArg("vec3", "s")]); | |||
CmdType(["sz", "scalez"], "Scale vertices", [CmdArg("vec3", "s")]); | |||
CmdType(["s", "scale"], "Uniformly Scale vertices", [CmdArg("float", "s")]); | |||
CmdType(["mx", "mirrorx"], "Mirror vertices through X-plane"); | |||
CmdType(["my", "mirrory"], "Mirror vertices through Y-plane"); | |||
CmdType(["mz", "mirrorz"], "Mirror vertices through Z-plane"); | |||
CmdType(["ch", "chamfer"], "DOES NOT WORK: Performs a chamfer operation", [CmdArg("float", "f")]); | |||
CmdType(["splt", "splittriangle"], "split triangles in 4 smaller ones", [CmdArg("int", "pass")]); | |||
CmdType(["smth", "smooth"], "Smooth the mesh by subdivising it", [CmdArg("int", "pass"), CmdArg("int", "split_per_pass"), CmdArg("int", "smooth_per_pass")]); | |||
//------------------------------------------------------------------------- | |||
//Mesh shape operations | |||
//------------------------------------------------------------------------- | |||
CmdType(["ac", "addcylinder"], "Cylinder centered on (0,0,0) with BBox:\nMin: [-.5 * max(d1, d2),-.5 * h,-.5 * max(d1, d2)]\nMax: [ .5 * max(d1, d2), .5 * h, .5 * max(d1, d2)]", | |||
[CmdArg("int", "nsides"), CmdArg("float", "h"), CmdArg("float", "d1"), CmdArg("float", "d2"), | |||
CmdArg("bool", "dualsides", "false"), CmdArg("bool", "smooth", "false"), CmdArg("bool", "close", "false")]); | |||
CmdType(["asph", "addsphere"], "Sphere centered on (0,0,0) with BBox:\nMin: [-.5 * d]\nMax: [ .5 * d]", [CmdArg("int", "ndivisions"), CmdArg("float", "d")]); | |||
CmdType(["acap", "addcapsule"], "Capsule centered on (0,0,0) with BBox:\nMin: [-.5 * d,-(.5 * d + h),-.5 * d]\nMax: [ .5 * d, (.5 * d + h), .5 * d]", [CmdArg("int", "ndivisions"), CmdArg("float", "h"), CmdArg("float", "d")]); | |||
CmdType(["ato", "addtorus"], "Torus centered on (0,0,0) with BBox:\nMax: [-.5 * d2]\nMax: [ .5 * d2]", [CmdArg("int", "ndivisions"), CmdArg("float", "d1"), CmdArg("float", "d2")]); | |||
CmdType(["ab", "addbox"], "Box centered on (0,0,0) with BBox:\nMin: [-.5 * size]\nMax: [ .5 * size]", [CmdArg("vec3", "size"), CmdArg("float", "chamf", "0.0")]); | |||
CmdType(["ascb", "addsmoothchamfbox"], "Box centered on (0,0,0) with BBox:\nMin: [-.5 * size]\nMax: [ .5 * size]", [CmdArg("vec3", "size"), CmdArg("float", "chamf")]); | |||
CmdType(["afcb", "addflatchamfbox"], "Box centered on (0,0,0) with BBox:\nMin: [-.5 * size]\nMax: [ .5 * size]", [CmdArg("vec3", "size"), CmdArg("float", "chamf")]); | |||
CmdType(["as", "addstar"], "Append a Star centered on (0,0,0)\nContained in a disc of max(d1, d2) diameter.", | |||
[CmdArg("int", "nbranches"), CmdArg("float", "d1"), CmdArg("float", "d2"), | |||
CmdArg("bool", "fade", "false"), CmdArg("bool", "fade2", "false")]); | |||
CmdType(["aes", "addexpandedstar"], "Star centered on (0,0,0)\nContained in a disc of max(max(d1, d2), max(d1 + extrad, d2 + extrad)) diameter.\nExpanded star branches use Color2.", | |||
[CmdArg("int", "nbranches"), CmdArg("float", "d1"), CmdArg("float", "d2"), CmdArg("float", "extrad", "0.0")]); | |||
CmdType(["ad", "adddisc"], "Disc centered on (0,0,0) with d diameter.", [CmdArg("int", "nsides"), CmdArg("float", "d"), CmdArg("bool", "fade", "false")]); | |||
CmdType(["at", "addtriangle"], "Triangle centered on (0,0,0)\nContained in a disc of d diameter.", [CmdArg("float", "d"), CmdArg("bool", "fade", "false")]); | |||
CmdType(["aq", "addquad"], "Quad centered on (0,0,0) with BBox:\nMin: [-size * .5f, 0,-size * .5f]\nMax: [ size * .5f, 0, size * .5f]", [CmdArg("float", "size"), CmdArg("bool", "fade", "false")]); | |||
CmdType(["acg", "addcog"], "Gear centered on (0,0,0) with BBox:\nMin: [-.5 * max(d1, d2),-.5 * h,-.5 * max(d1, d2)]\nMax: [ .5 * max(d1, d2), .5 * h, .5 * max(d1, d2)]", | |||
[CmdArg("float", "h"), CmdArg("float", "d10"), CmdArg("float", "d20"), CmdArg("float", "d1"), CmdArg("float", "d2"), CmdArg("float", "d12"), CmdArg("float", "d22"), | |||
CmdArg("float", "sidemul", "1.0"), CmdArg("bool", "offset", "false")]); |
@@ -0,0 +1,158 @@ | |||
function TypeDictionnary(m_name) | |||
{ | |||
this.m_name = m_name; | |||
this.m_cmds = new Array(); | |||
this.m_vars = new Array(); | |||
} | |||
//----------------------------------------------------------------------------- | |||
//Command Var object | |||
//----------------------------------------------------------------------------- | |||
function CmdVarObj() { } | |||
function CmdVar(m_type, m_syntax) | |||
{ | |||
var current_mesh_dict = GetCmdDictionnary(); | |||
new_obj = new CmdVarObj(); | |||
new_obj.m_type = m_type; | |||
new_obj.m_syntax = m_syntax; | |||
new_obj.ToString = function() | |||
{ | |||
var res = m_type + ' '; | |||
if (m_syntax != undefined) | |||
for (var i = 0; i < m_syntax.length; i++) | |||
res += m_syntax[i] + ' '; | |||
} | |||
current_mesh_dict.m_vars[current_mesh_dict.m_vars.length] = new_obj; | |||
} | |||
//----------------------------------------------------------------------------- | |||
//Command Argument object | |||
//----------------------------------------------------------------------------- | |||
function CmdArgObj() { } | |||
function CmdArg(m_type, m_name, m_optional) | |||
{ | |||
new_obj = new CmdArgObj(); | |||
new_obj.m_type = m_type; | |||
new_obj.m_name = m_name; | |||
new_obj.m_optional = m_optional; | |||
new_obj.ToString = function() | |||
{ | |||
if (m_optional != undefined) | |||
return m_type + ' ' + m_name + ' = ' + m_optional; | |||
return m_type + ' ' + m_name; | |||
} | |||
return new_obj; | |||
} | |||
//----------------------------------------------------------------------------- | |||
//Command Typing object | |||
//----------------------------------------------------------------------------- | |||
function CmdTypeObj() { } | |||
function CmdType(m_name, m_comment, m_arg) | |||
{ | |||
var current_mesh_dict = GetCmdDictionnary(); | |||
new_obj = new CmdTypeObj(); | |||
new_obj.m_name = m_name; | |||
new_obj.m_comment = m_comment; | |||
new_obj.m_arg = m_arg; | |||
new_obj.ToString = function() | |||
{ | |||
var str = m_name.toString() + ' [' + m_comment + ']'; | |||
if (m_arg != undefined) | |||
{ | |||
str += '{'; | |||
var found_optional = false; | |||
for (var vi = 0; vi < m_arg.length; vi++) | |||
{ | |||
if (m_arg[vi].m_optional != undefined && found_optional == false) | |||
{ | |||
str += ' ['; | |||
found_optional = true; | |||
} | |||
if (vi != 0) | |||
str += ', '; | |||
str += m_arg[vi].ToString(); | |||
} | |||
if (found_optional == true) | |||
str += ']'; | |||
str += '}'; | |||
} | |||
return str; | |||
} | |||
new_obj.CheckCommand = function(check_name) | |||
{ | |||
if (m_name != undefined && check_name.length > 0) | |||
{ | |||
for (var i = 0; i < m_name.length; i++) | |||
{ | |||
if (m_name[i] != undefined) | |||
{ | |||
var pattern = new RegExp("^[ ]*" + check_name + "[a-z]*"); | |||
if (pattern.test(m_name[i])) | |||
return true; | |||
} | |||
} | |||
} | |||
return false; | |||
} | |||
current_mesh_dict.m_cmds[current_mesh_dict.m_cmds.length] = new_obj; | |||
} | |||
//----------------------------------------------------------------------------- | |||
//Tries to find a matching command in the dictionnary based on the current cursor location in the given TextArea. | |||
//----------------------------------------------------------------------------- | |||
function FindMatchingCommand(src_text_area) | |||
{ | |||
if (src_text_area != undefined) | |||
{ | |||
var current_mesh_dict = GetCmdDictionnary(); | |||
var found_match = ""; | |||
var check = true; | |||
var cursor = Math.min(src_text_area.selectionStart, src_text_area.value.length - 1); | |||
//Weird test to ensure we don't start searching on the next line or on the next word. | |||
if (!src_text_area.value[cursor].match(/^[ \n]$/)) | |||
cursor++; | |||
cursor = Math.min(cursor, src_text_area.value.length - 1); | |||
var o = 0; | |||
while (check && o < 10) | |||
{ | |||
//Move backward to find the first letter on this line | |||
for (; cursor > 0; cursor--) | |||
if (src_text_area.value[cursor].match(/^[a-z\n]+$/)) | |||
break; | |||
//Move backward to find the start of the command | |||
for (; cursor > 0; cursor--) | |||
if (!src_text_area.value[cursor - 1].match(/^[#0-9a-z]+$/)) | |||
break; | |||
//If the cursor is on a "#" and the previous is a " ", we're on a color, repeat the operation | |||
if (cursor > 0 && src_text_area.value[cursor - 1].match(/[ ]/) && | |||
src_text_area.value[cursor].match(/[#]/)) | |||
check = true; | |||
else | |||
check = false; | |||
o++; | |||
} | |||
//Move forward to find the end of the word | |||
for (; cursor < src_text_area.value.length; cursor++) | |||
{ | |||
if (src_text_area.value[cursor].match(/^[a-z]+$/)) | |||
found_match += src_text_area.value[cursor]; | |||
else | |||
break; | |||
} | |||
//Try to match the command with the dictionnary | |||
var match_data = new Object(); | |||
match_data.match = found_match; | |||
match_data.match_list = new Array(); | |||
for (cursor = 0; cursor < current_mesh_dict.m_cmds.length; cursor++) | |||
if (current_mesh_dict.m_cmds[cursor].CheckCommand(found_match)) | |||
match_data.match_list[match_data.match_list.length] = cursor; | |||
return match_data; | |||
} | |||
} |
@@ -1,7 +1,18 @@ | |||
[sc#f8f ab 1 splt 4 twy 90] | |||
sc#f8f afcb 1 1 1 0 | |||
//test | |||
//[sc#f8f ab 1 splt 4 twy 90] | |||
// splt 5 twy 90 0 | |||
//[sc#f8f afcb 10 10 10 .25 tx 0 splt 4 twy 1.6 0 ] | |||
//sc#fff | |||
@@ -24,8 +24,10 @@ using namespace lol; | |||
static int const TEXTURE_WIDTH = 256; | |||
#define R_M 2.f | |||
#define WIDTH (770.f * R_M) | |||
#define HEIGHT (200.f * R_M) | |||
#define DEFAULT_WIDTH (770.f * R_M) | |||
#define DEFAULT_HEIGHT (200.f * R_M) | |||
#define WIDTH ((float)Video::GetSize().x) | |||
#define HEIGHT ((float)Video::GetSize().y) | |||
#define SCREEN_W (10.f / WIDTH) | |||
#define SCREEN_LIMIT 1.1f | |||
#define RATIO_HW (HEIGHT / WIDTH) | |||
@@ -522,7 +524,7 @@ int main(int argc, char **argv) | |||
{ | |||
System::Init(argc, argv); | |||
Application app("MeshViewer", ivec2((int)WIDTH, (int)HEIGHT), 60.0f); | |||
Application app("MeshViewer", ivec2((int)DEFAULT_WIDTH, (int)DEFAULT_HEIGHT), 60.0f); | |||
if (argc > 1) | |||
new MeshViewer(argv[1]); | |||
else | |||
@@ -60,12 +60,14 @@ | |||
<None Include="data\mesh-buffer.txt"> | |||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild> | |||
</None> | |||
<None Include="EasyMeshDictionnary.js" /> | |||
<None Include="meshviewer_index.html"> | |||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
</None> | |||
<None Include="meshviewer_nacl.nmf"> | |||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild> | |||
</None> | |||
<None Include="TypeDictionnary.js" /> | |||
</ItemGroup> | |||
<ItemGroup> | |||
<LolFxCompile Include="shinyfur.lolfx" /> | |||
@@ -1,4 +1,4 @@ | |||
<!DOCTYPE html> | |||
<DOCTYPE html> | |||
<html> | |||
<!-- | |||
@@ -10,66 +10,268 @@ | |||
<head> | |||
<style type="text/css"> | |||
progress { | |||
body | |||
{ | |||
font:12px Consolas; | |||
} | |||
#status_field | |||
{ | |||
font:12px Consolas; | |||
} | |||
button | |||
{ | |||
font:14px Consolas; | |||
} | |||
textarea | |||
{ | |||
font:14px Consolas; | |||
} | |||
progress | |||
{ | |||
background-color: #f3f3f3; | |||
border: 0; | |||
height: 18px; | |||
height: 18px; | |||
width: 200px; | |||
border-radius: 9px; | |||
} | |||
progress::-webkit-progress-bar { | |||
progress::-webkit-progress-bar | |||
{ | |||
background-color: #f3f3f3; | |||
border: 1px solid #000000; | |||
padding: 2px 2px; | |||
height: 20px; | |||
border-radius: 0px; | |||
} | |||
progress::-webkit-progress-value { | |||
progress::-webkit-progress-value | |||
{ | |||
background-color: #22BB22; | |||
border: 0px; | |||
height: 14px; | |||
border-radius: 0px; | |||
} | |||
#listener { | |||
#listener | |||
{ | |||
position: relative; | |||
} | |||
#progress_bar { | |||
#progress_bar | |||
{ | |||
position: absolute; | |||
top: 40%; | |||
left: 40%; | |||
z-index: 3; | |||
} | |||
#nacl_div { | |||
nacl_div | |||
{ | |||
position: absolute; | |||
top: 2px; | |||
left: 2px; | |||
z-index: -1; | |||
} | |||
#BGCanvas { | |||
#BGCanvas | |||
{ | |||
border:1px solid #000000; | |||
} | |||
#DIV_command0 | |||
{ | |||
margin-left: 5px; | |||
} | |||
</style> | |||
<!-- | |||
--> | |||
<title>Mesh Viewer NaCl</title> | |||
<script type="text/javascript"> | |||
NaClModule = null; // Global application object. | |||
MeshCodeModule = null; | |||
statusText = 'NO-STATUS'; | |||
<title>Mesh Viewer NaCl</title> | |||
<script src="./TypeDictionnary.js"></script> | |||
<script type="text/javascript"> | |||
var EasyMeshDict = new TypeDictionnary("EasyMesh"); | |||
function GetCmdDictionnary() { return EasyMeshDict; } | |||
</script> | |||
<script src="./EasyMeshDictionnary.js"></script> | |||
<script type="text/javascript"> | |||
nacl_div = null; // Global application object. | |||
nacl_module = null; // Global application object. | |||
mesh_code_module = null; | |||
code_helper_cmd = [null, null]; | |||
code_helper_arg = null; | |||
code_helper_cmt = null; | |||
code_helper_var = null; | |||
code_helper_alpha = null; | |||
status_text = 'NO-STATUS'; | |||
window.setTimeout("Tick()", 100); | |||
window.setTimeout("Init()", 100); | |||
function Tick() { | |||
window.setTimeout("Tick()", 100); | |||
function Init() | |||
{ | |||
nacl_div = document.getElementById('DIV_nacl_div'); | |||
mesh_code_module = document.getElementById('DIV_MeshCode'); | |||
code_helper_cmd[0] = document.getElementById('DIV_command0'); | |||
code_helper_cmd[1] = document.getElementById('DIV_command1'); | |||
code_helper_arg = document.getElementById('DIV_args'); | |||
code_helper_cmt = document.getElementById('DIV_comment'); | |||
code_helper_var = document.getElementById('DIV_var_usage'); | |||
code_helper_alpha = document.getElementById('DIV_alphabet'); | |||
code_helper_alpha.innerHTML = ' ['; | |||
for (var a = 'a'.charCodeAt(0); a <= 'z'.charCodeAt(0); a++) | |||
{ | |||
var stop = false; | |||
for (var i = 0; !stop && i < EasyMeshDict.m_cmds.length; i++) | |||
{ | |||
for (var j = 0; j < EasyMeshDict.m_cmds[i].m_name.length; j++) | |||
{ | |||
if (EasyMeshDict.m_cmds[i].m_name[j][0] == String.fromCharCode(a)) | |||
{ | |||
code_helper_alpha.innerHTML += '<b>' + String.fromCharCode(a) + '</b>'; | |||
stop = true; | |||
break; | |||
} | |||
} | |||
} | |||
if (!stop) | |||
code_helper_alpha.innerHTML += '.'; | |||
} | |||
code_helper_alpha.innerHTML += '] <br> '; | |||
} | |||
function Tick() | |||
{ | |||
window.setTimeout("Tick()", 100); | |||
/* -- cmd lookup code. */ | |||
if (mesh_code_module != undefined) | |||
{ | |||
var cmd_size = 8; | |||
var found = FindMatchingCommand(mesh_code_module); | |||
if (found.match_list.length > 0) | |||
{ | |||
var type_list = new Array(); | |||
code_helper_cmd[0].innerHTML = ""; | |||
code_helper_cmd[1].innerHTML = ""; | |||
code_helper_arg.innerHTML = ""; | |||
code_helper_cmt.innerHTML = ""; | |||
//Go through the found matches and show them. | |||
for (var i = 0; i < found.match_list.length; i++) | |||
{ | |||
var cur_match = EasyMeshDict.m_cmds[found.match_list[i]]; | |||
code_helper_cmd[0].innerHTML += '['; | |||
var max = cur_match.m_name.length; | |||
var word = 0; | |||
for (var j = 0; j < max; j++) | |||
{ | |||
var mth = found.match; | |||
var cmd = cur_match.m_name[j]; | |||
//Matching start caracters should be bold | |||
if (mth == cmd.slice(0, mth.length)) | |||
{ | |||
code_helper_cmd[word].innerHTML += ' '; | |||
code_helper_cmd[word].innerHTML += '<b>' + mth + '</b>'; | |||
code_helper_cmd[word].innerHTML += cmd.slice(mth.length, cmd.length); | |||
word++; | |||
} | |||
} | |||
//Complete empty command by <br> so commands in the two columns are on the same line | |||
word = (word > 0)?(2):(0); | |||
while (word-- > 0) | |||
code_helper_cmd[word].innerHTML += "<br>"; | |||
//Go through the arguments and show them | |||
if (found.match_list.length < 4 && i == 0) | |||
{ | |||
code_helper_arg.innerHTML += " > "; | |||
if (cur_match.m_arg != undefined) | |||
{ | |||
max = cur_match.m_arg.length; | |||
var found_optional = false; | |||
for (var j = 0; j < max; j++) | |||
{ | |||
if (cur_match.m_arg[j].m_optional != undefined && found_optional == false) | |||
{ | |||
var tab = '<br>'; for (var l = 0; l < 5; l++) tab += ' '; | |||
code_helper_arg.innerHTML += tab + 'Opt: ['; | |||
found_optional = true; | |||
} | |||
else if (j > 0) | |||
code_helper_arg.innerHTML += ', '; | |||
//Types are bold | |||
code_helper_arg.innerHTML += '<b>' + cur_match.m_arg[j].m_type + '</b> '; | |||
type_list[type_list.length] = cur_match.m_arg[j].m_type; | |||
//Names are not | |||
code_helper_arg.innerHTML += cur_match.m_arg[j].m_name; | |||
if (cur_match.m_arg[j].m_optional != undefined) | |||
code_helper_arg.innerHTML += ' = <b>' + cur_match.m_arg[j].m_optional + '</b>'; | |||
} | |||
if (found_optional == true) | |||
code_helper_arg.innerHTML += '] '; | |||
code_helper_arg.innerHTML += ' <br>'; | |||
} | |||
//Add the comment | |||
if (cur_match.m_comment != undefined) | |||
{ | |||
var tb_i = 16; var in_i = 8; | |||
var tab = '<br>'; | |||
if (cur_match.m_arg == undefined) { tb_i -= 8; in_i -= 8; } | |||
for (var l = 0; l < in_i; l++) code_helper_arg.innerHTML += ' '; | |||
for (var l = 0; l < tb_i; l++) tab += ' '; | |||
code_helper_arg.innerHTML += cur_match.m_comment + ' '; | |||
while (code_helper_arg.innerHTML.indexOf('\n') > -1) | |||
code_helper_arg.innerHTML = code_helper_arg.innerHTML.replace('\n', tab); | |||
} | |||
} | |||
} | |||
//Go through the type list and bold the used ones. | |||
if (EasyMeshDict.m_vars != undefined) | |||
{ | |||
code_helper_var.innerHTML = ""; | |||
var max = EasyMeshDict.m_vars.length; | |||
for (var j = 0; j < max; j++) | |||
{ | |||
var cur_var = EasyMeshDict.m_vars[j]; | |||
code_helper_var.innerHTML += " > "; | |||
var k = 0; | |||
for (; k < type_list.length; k++) | |||
if (cur_var.m_type == type_list[k]) | |||
break; | |||
//Bold the used variables | |||
if (k < type_list.length) | |||
code_helper_var.innerHTML += "<b>" + cur_var.m_type + "</b>"; | |||
else | |||
code_helper_var.innerHTML += cur_var.m_type; | |||
if (cur_var.m_syntax != undefined) | |||
{ | |||
var align_size = 9; | |||
var cmd_size = cur_var.m_type.length + 3; | |||
for (var m = 0; m < cur_var.m_syntax.length; m++) | |||
{ | |||
for (var l = 0; l < align_size - cmd_size; l++) | |||
code_helper_var.innerHTML += " "; | |||
code_helper_var.innerHTML += cur_var.m_syntax[m] + "<br>"; | |||
cmd_size = 0; | |||
} | |||
} | |||
} | |||
} | |||
} | |||
else | |||
{ | |||
code_helper_cmd[0].innerHTML = "[ ... "; | |||
code_helper_cmd[1].innerHTML = ""; | |||
code_helper_arg.innerHTML = ""; | |||
code_helper_cmt.innerHTML = ""; | |||
} | |||
} | |||
/* -- */ | |||
} | |||
// Indicate load success. | |||
function moduleDidLoad() { | |||
NaClModule = document.getElementById('ID_NaClModule'); | |||
MeshCodeModule = document.getElementById('ID_MeshCode'); | |||
nacl_module = document.getElementById('ID_NaClModule'); | |||
mesh_code_module = document.getElementById('DIV_MeshCode'); | |||
updateStatus('Rock n\' Roll !!'); | |||
var progress_bar = document.getElementById('progress_bar'); | |||
progress_bar.style.visibility="hidden"; | |||
var progress_bar = document.getElementById('progress_bar'); | |||
progress_bar.style.visibility = "hidden"; | |||
} | |||
// The 'message' event handler. This handler is fired when the NaCl module | |||
@@ -84,7 +286,7 @@ progress::-webkit-progress-value { | |||
// status message indicating that the module is still loading. Otherwise, | |||
// do not change the status message. | |||
function pageDidLoad() { | |||
if (NaClModule == null) { | |||
if (nacl_module == null) { | |||
updateStatus('Please wait, loading ...'); | |||
} else { | |||
// It's possible that the Native Client module onload event fired | |||
@@ -99,83 +301,116 @@ progress::-webkit-progress-value { | |||
// exists, then set its HTML to the status message as well. | |||
// opt_message The message test. If this is null or undefined, then | |||
// attempt to set the element with id 'statusField' to the value of | |||
// |statusText|. | |||
// |status_text|. | |||
function updateStatus(opt_message) { | |||
if (opt_message) | |||
statusText = opt_message; | |||
status_text = opt_message; | |||
var statusField = document.getElementById('status_field'); | |||
if (statusField) { | |||
statusField.innerHTML = statusText; | |||
statusField.innerHTML = status_text; | |||
} | |||
} | |||
function moduleCrash(event) | |||
{ | |||
alert("Module has crashed !"); | |||
//nacl_module.src = null; | |||
} | |||
function moduleLoadProgress(event) | |||
{ | |||
var progressBar = document.getElementById("p"); | |||
var statusField = document.getElementById('status_field'); | |||
if (event.lengthComputable) { | |||
if (event.lengthComputable) | |||
{ | |||
progressBar.max = event.total; | |||
progressBar.value = event.loaded; | |||
var load_progress = ((event.loaded / event.total) * 100.0); | |||
status_field.innerHTML = 'Please wait, loading [' + load_progress.toFixed(0) + '%]'; | |||
var load_progress = ((event.loaded / event.total) * 100.0); | |||
status_field.innerHTML = 'Please wait, loading [' + load_progress.toFixed(0) + '%]'; | |||
} | |||
else { | |||
else | |||
{ | |||
progressBar.value = -1; | |||
status_field.innerHTML = 'Computing progress ...' | |||
} | |||
} | |||
//Called by the "Send Mesh Command !" button | |||
function SendMeshData() | |||
{ | |||
if (NaClModule) | |||
NaClModule.postMessage(MeshCodeModule.value); | |||
if (nacl_module) | |||
nacl_module.postMessage(mesh_code_module.value); | |||
else | |||
alert("Module not loaded"); | |||
} | |||
</script> | |||
</head> | |||
<body onload="pageDidLoad()"> | |||
<h1>Mesh Viewer : Native Client version.</h1> | |||
<p> | |||
<div id="final_div"> | |||
<div id="final_div"> | |||
<div id="listener" align="center" style="width:770px;height:200px"> | |||
<canvas id="BGCanvas" width="772" height="202"> | |||
test | |||
</canvas> | |||
<canvas id="BGCanvas" width="772" height="202"></canvas> | |||
<div id="progress_bar"> | |||
<div id="status_field">NO-STATUS</div> | |||
<progress id=p align="left"></progress> | |||
<progress id="p" align="left" width="200"></progress> | |||
</div> | |||
<div id="nacl_div"> | |||
<div id="DIV_nacl_div"> | |||
<!-- | |||
<param name="wmode" value="opaque"/> | |||
<embed name="nacl_module" | |||
id="ID_NaClModule" | |||
width=770 height=200 | |||
src="meshviewer_nacl.nmf" | |||
type="application/x-nacl" /> | |||
id="ID_NaClModule" | |||
width=770 height=200 | |||
src="meshviewer_nacl.nmf" | |||
type="application/x-nacl" /> | |||
--> | |||
</div> | |||
<script type="text/javascript"> | |||
var listener = document.getElementById('listener'); | |||
listener.addEventListener('load', moduleDidLoad, true); | |||
listener.addEventListener('progress', moduleLoadProgress, true); | |||
listener.addEventListener('message', handleMessage, true); | |||
listener.addEventListener('crash', moduleCrash, true); | |||
</script> | |||
</div> | |||
</div> | |||
</div> | |||
</p> | |||
<h2>Status</h2> | |||
<div id="tick_field"></div> | |||
<div id="bouton"> | |||
<textarea id="ID_MeshCode" rows="5" cols="80"> | |||
//This is a comment | |||
sc#f8f afcb 1 1 1 0 | |||
</textarea> | |||
</div> | |||
<div> | |||
<button onclick="SendMeshData()">Update Mesh</button> | |||
</div> | |||
<div><button onclick="SendMeshData()">Send Mesh Command !</button></div> | |||
<table border="0" cellpadding="0" cellspacing="0"> | |||
<tr> | |||
<td> | |||
<div id="bouton"> | |||
<textarea autofocus id="DIV_MeshCode" rows="6" cols="94" style="font: 14px Consolas; resize: none;">//This is a comment | |||
sc#f8f afcb 1 1 1 0</textarea> | |||
</div> | |||
</td> | |||
<td valign="top" rowspan="3"> </td> | |||
<td valign="top" rowspan="3"> | |||
<div><b><u>Variable Types usage :</u></b></div> | |||
<div id="DIV_var_usage"></div> | |||
</td> | |||
</tr> | |||
<tr> | |||
<td> | |||
<div id="DIV_alphabet"></div> | |||
</td> | |||
</tr> | |||
<tr> | |||
<td valign="top"> | |||
<table border="0" cellpadding="0" cellspacing="0"> | |||
<tr> | |||
<td valign="top"><div id="DIV_command0"></div></td> | |||
<td valign="top"><div id="DIV_command1"></div></td> | |||
<td valign="top"><div id="DIV_args" ></div></td> | |||
<td valign="top"><div id="DIV_comment" ></div></td> | |||
</tr> | |||
</table> | |||
</td> | |||
</tr> | |||
</table> | |||
</body> | |||
</html> |