Skip to content

Commit 65b657a

Browse files
committed
Add parsing of GLSL arrays
1 parent de15c3a commit 65b657a

4 files changed

Lines changed: 75 additions & 51 deletions

File tree

Lines changed: 0 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,3 @@
1-
#version 300 es
2-
3-
precision highp float;
4-
5-
const int LIMB_SIZE = 32;
6-
const int FRACTIONAL_SIZE = LIMB_SIZE/2;
7-
8-
struct number{
9-
uint limb[LIMB_SIZE];
10-
int sign;
11-
bool is_infinite;
12-
};
13-
14-
struct hp_vec2{
15-
number x;
16-
number y;
17-
};
18-
19-
hp_vec2 initialize_hp_vec2(number x, number y){
20-
hp_vec2 res;
21-
res.x = x;
22-
res.y = y;
23-
return res;
24-
}
25-
26-
number null_number(){
27-
number res;
28-
for(int i = 0; i < LIMB_SIZE; ++i){
29-
res.limb[i] = 0u;
30-
}
31-
res.sign = 1;
32-
return res;
33-
}
34-
35-
number infinite_number(){
36-
number res;
37-
for(int i = 0; i < LIMB_SIZE; ++i){
38-
res.limb[i] = (1u<<31u)-1u;
39-
}
40-
res.sign = 1;
41-
res.is_infinite = true;
42-
return res;
43-
}
44-
45-
number number_one() {
46-
number res = null_number();
47-
res.limb[FRACTIONAL_SIZE] = 1u;
48-
return res;
49-
}
50-
511
number hp_neg(number a){
522
a.sign *= -1;
533
return a;
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
#version 300 es
2+
3+
precision highp float;
4+
5+
const int LIMB_SIZE = 32;
6+
const int FRACTIONAL_SIZE = LIMB_SIZE/2;
7+
8+
struct number{
9+
uint limb[LIMB_SIZE];
10+
int sign;
11+
bool is_infinite;
12+
};
13+
14+
struct hp_vec2{
15+
number x;
16+
number y;
17+
};
18+
19+
hp_vec2 initialize_hp_vec2(number x, number y){
20+
hp_vec2 res;
21+
res.x = x;
22+
res.y = y;
23+
return res;
24+
}
25+
26+
number initialize_number(uint limb[LIMB_SIZE], int sign, bool is_infinite){
27+
number res;
28+
res.limb = limb;
29+
res.sign = sign;
30+
res.is_infinite = is_infinite;
31+
}
32+
33+
number null_number(){
34+
number res;
35+
for(int i = 0; i < LIMB_SIZE; ++i){
36+
res.limb[i] = 0u;
37+
}
38+
res.sign = 1;
39+
return res;
40+
}
41+
42+
number infinite_number(){
43+
number res;
44+
for(int i = 0; i < LIMB_SIZE; ++i){
45+
res.limb[i] = (1u<<31u)-1u;
46+
}
47+
res.sign = 1;
48+
res.is_infinite = true;
49+
return res;
50+
}
51+
52+
number number_one() {
53+
number res = null_number();
54+
res.limb[FRACTIONAL_SIZE] = 1u;
55+
return res;
56+
}

src/transformer/transformer.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,16 @@ string stack_to_glsl_string(const vector<TokenOperator>& stack) {
4242
if (str_stack.empty()) return "";
4343
return str_stack.top();
4444
}
45+
46+
string vector_to_glsl_array(const vector<unsigned int>& limbs){
47+
string out = "uint[](";
48+
for(const unsigned int& limb : limbs){
49+
out += std::to_string(limb) + "u,";
50+
}
51+
out.pop_back();
52+
out += ");";
53+
}
54+
55+
string big_number_to_glsl_string(const vector<unsigned int>& limbs, const int sign, const bool is_infinite = false){
56+
return "initialize_number(" + vector_to_glsl_array(limbs) + "," + std::to_string(sign) + "," + std::to_string(is_infinite) + ")";
57+
}

src/transformer/transformer.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,9 @@
66
/// <summary>/// Get an operator (unsigned char) and constant stack (glm::vec2) from a TokenOperator stack/// </summary>/// <param name="stack">The RPN TokenOperator stack</param>/// <param name="operator_stack">A queue of opcodes in RPN. Always send an empty vector here.</param>/// <param name="constant_stack">A queue of constants. Always send an empty vector here.</param>
77
void get_stacks(const vector<TokenOperator>& stack, vector<unsigned char>& operator_stack, vector<glm::vec2>& constant_stack);
88

9-
string stack_to_glsl_string(const vector <TokenOperator>& stack);
9+
string stack_to_glsl_string(const vector <TokenOperator>& stack);
10+
11+
string vector_to_glsl_array(const vector<unsigned int>& limbs);
12+
13+
string big_number_to_glsl_string(const vector<unsigned int>& limbs, const int sign, const bool is_infinite = false);
14+

0 commit comments

Comments
 (0)