From 4f86e6b27307f8eeecc8491dcbf97fe557baa6a9 Mon Sep 17 00:00:00 2001 From: Frank Galligan Date: Mon, 2 Oct 2017 15:04:54 -0700 Subject: [PATCH] Update conventions text of spec Thsi is associated with #134 --- docs/spec/04.00.00.conventions.md | 155 ++++++++++++++++-- docs/spec/images/attributes.png | Bin 0 -> 7739 bytes docs/spec/images/draco_file.png | Bin 0 -> 4732 bytes docs/spec/images/edgebreaker_connectivity.png | Bin 0 -> 7779 bytes .../edgebreaker_valence_connectivity.png | Bin 0 -> 8525 bytes docs/spec/images/sequential_connectivity.png | Bin 0 -> 3381 bytes 6 files changed, 139 insertions(+), 16 deletions(-) create mode 100755 docs/spec/images/attributes.png create mode 100755 docs/spec/images/draco_file.png create mode 100755 docs/spec/images/edgebreaker_connectivity.png create mode 100755 docs/spec/images/edgebreaker_valence_connectivity.png create mode 100755 docs/spec/images/sequential_connectivity.png diff --git a/docs/spec/04.00.00.conventions.md b/docs/spec/04.00.00.conventions.md index 12d8e2c..5af967e 100644 --- a/docs/spec/04.00.00.conventions.md +++ b/docs/spec/04.00.00.conventions.md @@ -1,33 +1,156 @@ ## Conventions +### Draco File Format + +* All Draco encoded mesh files are comprised of four main sections. This first +section is the header. The second section contains the metadata. This section is optional. The third section contains the connectivity data. The fourth section contains the attribute data. + +![Draco_file](images/draco_file.png) + +* The header must be decoded first, then the metadata section (if present), then the connectivity section, and then the attribute section. + + +#### Sequential Connectivity + +* The sequential connectivity is comprised of two sections. The first section is the connectivity header. The second section is the indices data. + +![sequential_connectivity](images/sequential_connectivity.png) + + +#### EdgeBreaker Connectivity + +* The EdgeBreaker connectivity section is composed of five sections. The first section is the connectivity header. The second section is the encoded EdgeBreaker symbol data. The third section is the encoded start face configuration data. The fourth section is the encoded split data.The fifth section is the attribute connectivity data. + +![edgebreaker_connectivity](images/edgebreaker_connectivity.png) + + +* The encoded split data must be decoded before the EdgeBreaker symbols are decoded. The offset to the split data is contained in the connectivity header. + + +#### Valence EdgeBreaker Connectivity + +* The valence EdgeBreaker connectivity inserts two sections in between the start face data and the split data. The first section is the EdgeBreaker valence header. The second section is the context data for the valence prediction. + +![edgebreaker_valence_connectivity](images/edgebreaker_valence_connectivity.png) + + +#### Attributes + +* The attributes data contains two sections. The first section is the attribute header. The second section is comprised of one or more attribute types, such as positions, texture coordinates, normals… Each attribute type section is comprised of one or more unique attributes. + +![attributes](images/attributes.png) + + + +### Draco Conventions + +* When bit reading is finished it will always pad the read to the current +byte. + +* varUI32 and varUI64 types must be decoded by the DecodeVarint() function. + + ### General Conventions - * When bit reading is finished it will always pad the read to the current - byte. - * varUI32 and varUI64 types must be decoded by the DecodeVarint() function. +The mathematical operators and their precedence rules used to describe this +Specification are similar to those used in the C programming language. - * Draco encoded mesh files are comprised of three main sections. This first - section is the header. The second section contains the connectivity data. - The third section contains the attribute data. The header must be decoded - first, then the connectivity section, and then the attribute section. +Assignment of an array is represented using the normal notation `A = B` and is +specified to mean the same as doing both the individual assignments +`A[ 0 ] = B[ 0 ]` and `A[ 1 ] = B[ 1 ].` Equality testing of 2 arrays is +represented using the notation `A == B` and is specified to mean the same as +`(A[ 0 ] == B[ 0 ] && A[ 1 ] == B[ 1 ])`. Inequality testing is defined as +`A != B` and is specified to mean the same as +`(A[ 0 ] != B[ 0 ] || A[ 1 ] != B[ 1 ])`. The functions `assign` and +`push_back` behave simialrily on arrays as it is defined for c++ std::vector. - * The Connectivity section is composed of the following sections in order: +When a variable is said to be representable by a signed integer with `x` bits, +it means that the variable is greater than or equal to `-(1 << (x-1))`, and that +the variable is less than or equal to `(1 << (x-1))-1`. - * Connectivity header - * EdgeBreaker symbol buffer +### Arithmetic operators - * Start face buffer +| | | +|:--------:| ------- | +| `+` | Addition +| `–` | Subtraction (as a binary operator) or negation (as a unary prefix operator) +| `*` | Multiplication +| `/` | Division +| `a % b` | Remainder from division of `a` by `b`. Both `a` and `b` are positive integers. +{:.conventions } - * EdgeBreaker valence header - * Context data for the valence prediction +### Logical operators - * Split data +| | | +|:--------:| ------- | +| `a && b` | Logical AND operation between `a` and `b` +| `a || b` | Logical OR operation between `a` and `b` +| `!` | Logical NOT operation. +{:.conventions } + + +### Relational operators + +| | | +|:--------:| ------- | +| `>` | Greater than +| `>=` | Greater than or equal to +| `<` | Less than +| `<=` | Less than or equal to +| `==` | Equal to +| `!=` | Not equal to +{:.conventions } + + +### Bitwise operators + +| | | +|:--------:| ------- | +| `&` | AND operation +| `|` | OR operation +| `~` | Negation operation +| `a >> b` | Shift `a` in 2's complement binary integer representation format to the right by `b` bit positions. This operator is only used with `b` being a non-negative integer. Bits shifted into the MSBs as a result of the right shift have a value equal to the MSB of `a` prior to the shift operation. +| `a << b` | Shift `a` in 2's complement binary integer representation format to the left by `b` bit positions. This operator is only used with `b` being a non-negative integer. Bits shifted into the LSBs as a result of the left shift have a value equal to `0`. +{:.conventions } + + +### Assignment + +| | | +|:--------:| ------- | +| `=` | Assignment operator +| `++` | Increment, `x++` is equivalent to `x = x + 1`. When this operator is used for an array index, the variable value is obtained before the auto increment operation +| `--` | Decrement, i.e. `x--` is equivalent to `x = x - 1`. When this operator is used for an array index, the variable value is obtained before the auto decrement operation +| `+=` | Addition assignment operator, for example `x += 3` corresponds to `x = x + 3` +| `-=` | Subtraction assignment operator, for example `x -= 3` corresponds to `x = x - 3` +{:.conventions } + + + +### Mathematical functions + +The following mathematical functions (Abs, Min, and Max) +are defined as follows: + + + +
+ + + +
+ + - * The split data must be decoded before the EdgeBreaker symbols are - decoded. ### Method of describing bitstream syntax diff --git a/docs/spec/images/attributes.png b/docs/spec/images/attributes.png new file mode 100755 index 0000000000000000000000000000000000000000..29ad13841129cd7cb8f884ecf0bafa834d32aacb GIT binary patch literal 7739 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 MUDL}Y+BYBm4?~TSI{*Lx literal 0 HcmV?d00001 diff --git a/docs/spec/images/draco_file.png b/docs/spec/images/draco_file.png new file mode 100755 index 0000000000000000000000000000000000000000..c501814fe1507c0f47c02e51067dcf338c507d52 GIT binary patch literal 4732 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 QZxVp6rlAJznqBDs1CqeU8~^|S literal 0 HcmV?d00001 diff --git a/docs/spec/images/sequential_connectivity.png b/docs/spec/images/sequential_connectivity.png new file mode 100755 index 0000000000000000000000000000000000000000..347bb52fbba526f3bacb17a26356e2fd9441e50a GIT binary patch literal 3381 zcmchZc~p}5zsJ#V(l$rU%q`8Ww6d{Wa&Hk+)SsoLDVWu?DYBS?;u<+KWsaIlI!Wqe z?gUJsA}U~0VN)t@Knf~lrA5FPDk*{&>)v~2&bfczf1dL_=lOh|&-#4duiRt*Il6J3 z$vOZ4urV;eFAMbrsbk`C_;Yw%RQK$fKfes<2mHu~D*gJHO# zgL-K~i*(>2DvKvb(;h z*7|IGx?Y+s%+AmS00cCzxuJ69d~3Pj%Qg10l9_#R?bCT9#>~pMw>F8uO~6g+I@W5g z1pu_ow9NnjOO&O$s_zece*geDC_E@s*M?hzTLZY-jqBF1vz|qkl(LXYs#LuXY|0`uuHVF`3CW@NH3aAX8K2tz;!@{7GR~qI{V7_gl$_ zY!!Kz;zHJ^l9j}lB8xAtEhd#qQspA;{Y*tHc4aNXT|S$=6uMfcW2jIiiS?x`3Z$xu z@m3fQv$s7fQ|>~>icbr-rG0q0FwJ;lNET#%F<80sj`5sImo;EwS3)MQ$iA>u3*ic; z+jdX3SB$J)nkMU;ip`irN>9(8BwMNbCj1PP@ENj)^q;(z%6gEw0nb901?h4r{qsrk zMBc>7B`fAk9y57wa}u=n;S9tor3%~eKF31&v~TJ>iKe6OfBR;fBHwrUCH;50WFC3I z!)|+Aa8cbny-@XpDgJqSxBU}cZ)I=QFw0Qv8B(*<#hP2(kstJ;ARnS7saYMJFiZ>a zc6X7dtDQ#LXR1$XUabqG5z1ptdrPqjT3gKthez@(S)tFP^u_Y*cYP1*F5;0ax~P1T z>N`mbE8H((8TrgT7<=?S`)x>}#23l3JSbc?$PLPM1tcrf&Hy7<0_@)oY|JxYNYgLpuZv zY+K=r+lMn0g>+c9cY(WO zVQNA-A(v{A((#QkG7K|6eVV?NQA}xu7QHInq}aVMlemHog<9AQca=S}f0p&@l|=ZS|HP z6!r&)B~2v9UMs#z{4mf|t{ALV)3$_F~0yWvp&$rPu$n$uU*ng z%lheqx$mL`!s=V3Wrf@$X_k+ecdXRzJ>=DP<7~)1yHcH)Nj|1(OM%UOqlYib)p1a| zI#9hPnKpEg@Y6dybDpou#Tz=|(>nCpt8PL6W{?o+9zBs_?8WOSASoF(1!iLI zc2z~B2dM7=OVnC>acV`t=2>t6II!UD2@A~bnv^Kb@`SR_;$k$lo)OcLKWWX%i-JP&sv@69}v-|)$ z+aU=*oIpp*}at5=KtE4XEE64p6SZ_5df6z1l8Yc4B1r} z|Gcl+` zMMJlA{I8U@oNPD=lpMq7)sk;SScN4!9*V|GFkP;5kI}G^#-Aqk zHp@+MYe-ey8kVT`HTH+2bm@6BN`K+i>C?ic<8Grl5qRn=f(5niux<>~Je=0!fFh!# zP{=w2S(M?symb7Owd{zmT{>ybI+67t@i_ROp)lk7pZwYqWO9~5m7gz_%MtQ3wnd#I(x+P1HlW$BfTxITNz-*BzL7B<9Sx z(^>%T3H)le2AkMTbU_ks5aD@kR+!@M$~q@3-R+XaM-qPsygWfDz3=>?HrBIxK+o-~ z;>jO$S8^TW;AV`nQ)UM3BzHLTBP-ZMzO^JP_2(~1^&5&g_{f`dW+U+DqhtWm&CmMA=@3B)fZ{kAPZ2K8vt70lhb>w}7^9)VjUKr{8a(3OI% zTsi#d?l^ohOlFQ>|IM#G%;wbXn+er%l@JlTK-_q2Gcn-RC+-gyZ1+ocdpfnCCzn*E zjV*>}Hs-(}$q8;ZYLe-b&^~OGI3FNbqZw%;9He?NCaKQr7A=}f@R{MJ!{nZj~00AOa$T4?RFcnF1-jpDcRFCcc*-qUhkS>Ol<= zMw_Pvx8F<+8G#K|)OqpVE!7=^oEi{~ZtbvL5@qZ;@mo4fB=WmUw&K$+?Rc z;**>sd-gytGkh*tWv&hk8i(5z?>c|^`p$D)1)l*Q+_Hc8-1(0J6H0!Kp)nq`o)Qzx zGpvO5i~V~81sI0OoZU?k-4+gda}j!2{