2020-05-11 17:19:42 +02:00
|
|
|
// Copyright 2020 The Ebiten Authors
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
// you may not use this file except in compliance with the License.
|
|
|
|
// You may obtain a copy of the License at
|
|
|
|
//
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
//
|
|
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
// See the License for the specific language governing permissions and
|
|
|
|
// limitations under the License.
|
|
|
|
|
|
|
|
package shaderir
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Type struct {
|
2020-05-12 16:32:32 +02:00
|
|
|
Main BasicType
|
|
|
|
Sub []Type
|
|
|
|
Length int
|
2020-05-11 17:19:42 +02:00
|
|
|
}
|
|
|
|
|
2020-06-10 17:29:01 +02:00
|
|
|
func (t *Type) Equal(rhs *Type) bool {
|
|
|
|
if t.Main != rhs.Main {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
if t.Length != rhs.Length {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
if len(t.Sub) != len(rhs.Sub) {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
for i, s := range t.Sub {
|
|
|
|
if !s.Equal(&rhs.Sub[i]) {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2020-06-20 11:10:23 +02:00
|
|
|
func (t *Type) String() string {
|
2020-05-12 16:32:32 +02:00
|
|
|
switch t.Main {
|
2020-05-11 17:19:42 +02:00
|
|
|
case None:
|
|
|
|
return "none"
|
|
|
|
case Bool:
|
|
|
|
return "bool"
|
2020-05-15 20:10:03 +02:00
|
|
|
case Int:
|
|
|
|
return "int"
|
2020-05-11 17:19:42 +02:00
|
|
|
case Float:
|
|
|
|
return "float"
|
|
|
|
case Vec2:
|
|
|
|
return "vec2"
|
|
|
|
case Vec3:
|
|
|
|
return "vec3"
|
|
|
|
case Vec4:
|
|
|
|
return "vec4"
|
|
|
|
case Mat2:
|
|
|
|
return "mat2"
|
|
|
|
case Mat3:
|
|
|
|
return "mat3"
|
|
|
|
case Mat4:
|
|
|
|
return "mat4"
|
|
|
|
case Array:
|
2020-06-20 11:10:23 +02:00
|
|
|
return fmt.Sprintf("%s[%d]", t.Sub[0].String(), t.Length)
|
2020-05-11 17:19:42 +02:00
|
|
|
case Struct:
|
|
|
|
str := "struct{"
|
2020-05-12 16:32:32 +02:00
|
|
|
sub := make([]string, 0, len(t.Sub))
|
|
|
|
for _, st := range t.Sub {
|
2020-06-20 11:10:23 +02:00
|
|
|
sub = append(sub, st.String())
|
2020-05-11 17:19:42 +02:00
|
|
|
}
|
|
|
|
str += strings.Join(sub, ",")
|
|
|
|
str += "}"
|
|
|
|
return str
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("?(unknown type: %d)", t)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-06-20 14:08:08 +02:00
|
|
|
func (t *Type) serialize() string {
|
|
|
|
return t.String()
|
|
|
|
}
|
|
|
|
|
2020-07-28 17:57:47 +02:00
|
|
|
func (t *Type) Glsl() string {
|
|
|
|
switch t.Main {
|
|
|
|
case Array:
|
|
|
|
return fmt.Sprintf("%s[%d]", t.Sub[0].Glsl(), t.Length)
|
|
|
|
case Struct:
|
|
|
|
panic("shaderir: a struct is not implemented")
|
|
|
|
default:
|
|
|
|
return t.Main.glsl()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-07-30 04:27:36 +02:00
|
|
|
func (t *Type) FloatNum() int {
|
|
|
|
switch t.Main {
|
|
|
|
case Float:
|
|
|
|
return 1
|
|
|
|
case Vec2:
|
|
|
|
return 2
|
|
|
|
case Vec3:
|
|
|
|
return 3
|
|
|
|
case Vec4:
|
|
|
|
return 4
|
|
|
|
case Mat2:
|
|
|
|
return 4
|
|
|
|
case Mat3:
|
|
|
|
return 9
|
|
|
|
case Mat4:
|
|
|
|
return 16
|
|
|
|
case Array:
|
|
|
|
return t.Length * t.Sub[0].FloatNum()
|
|
|
|
default: // TODO: Parse a struct correctly
|
|
|
|
return -1
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-05-11 17:19:42 +02:00
|
|
|
type BasicType int
|
|
|
|
|
|
|
|
const (
|
|
|
|
None BasicType = iota
|
|
|
|
Bool
|
2020-05-15 20:10:03 +02:00
|
|
|
Int
|
2020-05-11 17:19:42 +02:00
|
|
|
Float
|
|
|
|
Vec2
|
|
|
|
Vec3
|
|
|
|
Vec4
|
|
|
|
Mat2
|
|
|
|
Mat3
|
|
|
|
Mat4
|
|
|
|
Array
|
|
|
|
Struct
|
|
|
|
)
|
|
|
|
|
2020-07-28 17:57:47 +02:00
|
|
|
func (t BasicType) glsl() string {
|
2020-05-11 17:19:42 +02:00
|
|
|
switch t {
|
|
|
|
case None:
|
|
|
|
return "?(none)"
|
|
|
|
case Bool:
|
|
|
|
return "bool"
|
2020-05-15 20:10:03 +02:00
|
|
|
case Int:
|
2020-06-17 18:28:17 +02:00
|
|
|
return "int"
|
2020-05-11 17:19:42 +02:00
|
|
|
case Float:
|
|
|
|
return "float"
|
|
|
|
case Vec2:
|
|
|
|
return "vec2"
|
|
|
|
case Vec3:
|
|
|
|
return "vec3"
|
|
|
|
case Vec4:
|
|
|
|
return "vec4"
|
|
|
|
case Mat2:
|
|
|
|
return "mat2"
|
|
|
|
case Mat3:
|
|
|
|
return "mat3"
|
|
|
|
case Mat4:
|
|
|
|
return "mat4"
|
|
|
|
case Array:
|
|
|
|
return "?(array)"
|
|
|
|
case Struct:
|
|
|
|
return "?(struct)"
|
|
|
|
default:
|
|
|
|
return fmt.Sprintf("?(unknown type: %d)", t)
|
|
|
|
}
|
|
|
|
}
|