source: trunk/src/easymesh/easymesh-parser.y @ 1510

Last change on this file since 1510 was 1510, checked in by sam, 9 years ago

easymesh: move the Mesh builder into the engine core.

File size: 5.7 KB
RevLine 
[1419]1%{
2//
[1510]3// Lol Engine
[1419]4//
[1510]5// Copyright: (c) 2010-2012 Sam Hocevar <sam@hocevar.net>
6//            (c) 2009-2012 Cédric Lecacheur <jordx@free.fr>
[1423]7//            (c) 2009-2012 Benjamin Huet <huet.benjamin@gmail.com>
[1510]8//   This program is free software; you can redistribute it and/or
9//   modify it under the terms of the Do What The Fuck You Want To
10//   Public License, Version 2, as published by Sam Hocevar. See
11//   http://sam.zoy.org/projects/COPYING.WTFPL for more details.
[1419]12//
[1415]13
[1418]14#if defined HAVE_CONFIG_H
15#   include "config.h"
16#endif
17
18#include "core.h"
[1510]19#include "easymesh/easymesh.h"
[1418]20
[1510]21#include <string>
[1418]22
23%}
24
25%require "2.3"
26%debug
27%defines
[1415]28%skeleton "lalr1.cc"
[1510]29%name-prefix="lol"
30%define parser_class_name "EasyMeshParser"
[1415]31%locations
[1510]32%parse-param { class EasyMeshCompiler& mc }
[1418]33%error-verbose
34
[1415]35%union
36{
37    float fval;
[1432]38    /* Can't use uin32_t here for some reason */
39    unsigned u32val;
[1415]40    struct { float f0, f1, f2, f3, f4, f5, f6, f7; } args;
41}
42
[1419]43%start mesh_description
44
[1418]45%token T_COLOR T_BGCOLOR
[1415]46
47%token T_TRANSLATEX T_ROTATEX T_TAPERX T_SCALEX T_MIRRORX
48%token T_TRANSLATEY T_ROTATEY T_TAPERY T_SCALEY T_MIRRORY
49%token T_TRANSLATEZ T_ROTATEZ T_TAPERZ T_SCALEZ T_MIRRORZ
50%token T_TRANSLATE T_SCALE
[1506]51%token T_CHAMFER
[1415]52
53%token T_CYLINDER T_BOX T_SMOOTHCHAMFBOX T_FLATCHAMFBOX T_SPHERE T_STAR
54%token T_EXPANDEDSTAR T_DISC T_TRIANGLE T_QUAD T_COG
55
56%token T_END 0
[1442]57%token T_ERROR
[1415]58
59%token <fval> NUMBER
[1430]60%token <u32val> COLOR
[1415]61
62%type <fval> number
63%type <args> args1 args2 args3 args4 args5 args6 args7 args8
64
[1418]65%{
[1510]66#include "easymesh/easymesh-compiler.h"
[1415]67
[1418]68#undef yylex
[1422]69#define yylex mc.m_lexer->lex
[1418]70%}
71
[1419]72%%
[1418]73
[1415]74mesh_description:
[1434]75    mesh_expression_list T_END
[1415]76    ;
77
[1434]78mesh_expression_list:
79    mesh_expression
80  | mesh_expression mesh_expression_list
81  ;
82
83mesh_expression:
84    mesh_command_list
85  | mesh_open mesh_expression_list mesh_close
86    ;
87
88mesh_open:
89    '['       { mc.m_mesh.OpenBrace(); }
90    ;
91
92mesh_close:
93    ']'       { mc.m_mesh.CloseBrace(); }
94    ;
95
[1415]96mesh_command_list:
97    mesh_command
[1434]98  | mesh_command_list mesh_command
[1415]99    ;
100
101mesh_command:
[1442]102    color_command
[1415]103  | transform_command
104  | primitive_command
105    ;
106
107color_command:
[1422]108    T_COLOR args4   { mc.m_mesh.SetCurColor(vec4($2.f0, $2.f1, $2.f2, $2.f3)); }
[1495]109  | T_COLOR COLOR   { uint32_t x = $2;
110                      vec4 v(x >> 24, (x >> 16) & 0xff, (x >> 8) & 0xff, x & 0xff);
111                      mc.m_mesh.SetCurColor(vec4(v) * (1. / 255)); }
[1422]112  | T_BGCOLOR args4 { mc.m_mesh.SetCurColor2(vec4($2.f0, $2.f1, $2.f2, $2.f3)); }
[1495]113  | T_BGCOLOR COLOR { uint32_t x = $2;
114                      vec4 v(x >> 24, (x >> 16) & 0xff, (x >> 8) & 0xff, x & 0xff);
115                      mc.m_mesh.SetCurColor2(vec4(v) * (1. / 255)); }
[1415]116    ;
117
118transform_command:
[1506]119    T_CHAMFER args1     { mc.m_mesh.Chamfer($2.f0); }
120  | T_TRANSLATEX args1  { mc.m_mesh.Translate(vec3($2.f0, 0, 0)); }
[1422]121  | T_TRANSLATEY args1  { mc.m_mesh.Translate(vec3(0, $2.f0, 0)); }
122  | T_TRANSLATEZ args1  { mc.m_mesh.Translate(vec3(0, 0, $2.f0)); }
123  | T_TRANSLATE args3   { mc.m_mesh.Translate(vec3($2.f0, $2.f1, $2.f2)); }
124  | T_ROTATEX args1     { mc.m_mesh.RotateX($2.f0); }
125  | T_ROTATEY args1     { mc.m_mesh.RotateY($2.f0); }
126  | T_ROTATEZ args1     { mc.m_mesh.RotateZ($2.f0); }
127  | T_TAPERX args3      { mc.m_mesh.TaperX($2.f0, $2.f1, $2.f2); }
128  | T_TAPERY args3      { mc.m_mesh.TaperY($2.f0, $2.f1, $2.f2); }
129  | T_TAPERZ args3      { mc.m_mesh.TaperZ($2.f0, $2.f1, $2.f2); }
130  | T_SCALEX args1      { mc.m_mesh.Scale(vec3($2.f0, 0, 0)); }
131  | T_SCALEY args1      { mc.m_mesh.Scale(vec3(0, $2.f0, 0)); }
132  | T_SCALEZ args1      { mc.m_mesh.Scale(vec3(0, 0, $2.f0)); }
133  | T_SCALE args3       { mc.m_mesh.Scale(vec3($2.f0, $2.f1, $2.f2)); }
134  | T_MIRRORX           { mc.m_mesh.MirrorX(); }
135  | T_MIRRORY           { mc.m_mesh.MirrorY(); }
136  | T_MIRRORZ           { mc.m_mesh.MirrorZ(); }
[1415]137    ;
138
139primitive_command:
[1422]140    T_CYLINDER args6       { mc.m_mesh.AppendCylinder((int)$2.f0, $2.f1,
[1415]141                                                 $2.f2, $2.f3,
142                                                 (int)$2.f4, (int)$2.f5); }
[1422]143  | T_BOX args3            { mc.m_mesh.AppendBox(vec3($2.f0, $2.f1, $2.f2)); }
144  | T_SMOOTHCHAMFBOX args4 { mc.m_mesh.AppendSmoothChamfBox(vec3($2.f0, $2.f1,
[1415]145                                                            $2.f2), $2.f3); }
[1422]146  | T_FLATCHAMFBOX args4   { mc.m_mesh.AppendFlatChamfBox(vec3($2.f0, $2.f1,
[1415]147                                                          $2.f2), $2.f3); }
[1422]148  | T_SPHERE args4         { mc.m_mesh.AppendSphere($2.f0,
[1415]149                                               vec3($2.f1, $2.f2, $2.f3)); }
[1422]150  | T_STAR args5           { mc.m_mesh.AppendStar((int)$2.f0, $2.f1, $2.f2,
[1415]151                                             (int)$2.f3, (int)$2.f4); }
[1422]152  | T_EXPANDEDSTAR args4   { mc.m_mesh.AppendExpandedStar((int)$2.f0, $2.f1,
[1415]153                                                     $2.f2, $2.f3); }
[1422]154  | T_DISC args3           { mc.m_mesh.AppendDisc((int)$2.f0, $2.f1, (int)$2.f2); }
155  | T_TRIANGLE args2       { mc.m_mesh.AppendSimpleTriangle($2.f0, (int)$2.f1); }
156  | T_QUAD args2           { mc.m_mesh.AppendSimpleQuad($2.f0, (int)$2.f1); }
157  | T_COG args8            { mc.m_mesh.AppendCog((int)$2.f0, $2.f1, $2.f2, $2.f3,
[1415]158                                            $2.f4, $2.f5, $2.f6, (int)$2.f7); }
159    ;
160
161args1: number { $$.f0 = $1; } ;
[1434]162args2: args1 number { $$ = $1; $$.f1 = $2; } ;
163args3: args2 number { $$ = $1; $$.f2 = $2; } ;
164args4: args3 number { $$ = $1; $$.f3 = $2; } ;
165args5: args4 number { $$ = $1; $$.f4 = $2; } ;
166args6: args5 number { $$ = $1; $$.f5 = $2; } ;
167args7: args6 number { $$ = $1; $$.f6 = $2; } ;
168args8: args7 number { $$ = $1; $$.f7 = $2; } ;
[1415]169
170number:
171    NUMBER       { $$ = $1; }
172  | '-' number   { $$ = -$2; }
173    ;
174
[1419]175%%
[1415]176
[1510]177void lol::EasyMeshParser::error(const EasyMeshParser::location_type& l,
[1418]178                                const std::string& m)
[1415]179{
[1422]180    mc.Error(l, m);
[1415]181}
[1419]182
Note: See TracBrowser for help on using the repository browser.