Compare commits

..

No commits in common. "a3856cdc9d8227d9dafbcb0d917ee009ecaff9c1" and "4196766a2b36478db0b5872cf4e892afd2117c00" have entirely different histories.

4 changed files with 11 additions and 40 deletions

View File

View File

@ -41,7 +41,6 @@ decls = {
ops = { ops = {
"mov": "{0} = {1};", "mov": "{0} = {1};",
"mov_sat": "{0} = clamp({1}, 0.0, 1.0)",
"add": "{0} = {1} + {2};", "add": "{0} = {1} + {2};",
"mul": "{0} = {1} * {2};", "mul": "{0} = {1} * {2};",
"mad": "{0} = {1} * {2} + {3};", "mad": "{0} = {1} * {2} + {3};",
@ -54,7 +53,7 @@ ops = {
"slt": "{0} = float4(({1}.x < {2}.x) ? 1.0f : 0.0f, ({1}.y < {2}.y) ? 1.0f : 0.0f, ({1}.z < {2}.z) ? 1.0f : 0.0f, ({1}.w < {2}.w) ? 1.0f : 0.0f);", "slt": "{0} = float4(({1}.x < {2}.x) ? 1.0f : 0.0f, ({1}.y < {2}.y) ? 1.0f : 0.0f, ({1}.z < {2}.z) ? 1.0f : 0.0f, ({1}.w < {2}.w) ? 1.0f : 0.0f);",
"sge": "{0} = float4(({1}.x >= {2}.x) ? 1.0f : 0.0f, ({1}.y >= {2}.y) ? 1.0f : 0.0f, ({1}.z >= {2}.z) ? 1.0f : 0.0f, ({1}.w >= {2}.w) ? 1.0f : 0.0f);", "sge": "{0} = float4(({1}.x >= {2}.x) ? 1.0f : 0.0f, ({1}.y >= {2}.y) ? 1.0f : 0.0f, ({1}.z >= {2}.z) ? 1.0f : 0.0f, ({1}.w >= {2}.w) ? 1.0f : 0.0f);",
"rcp": "{0} = ({1} == 0.0f) ? FLT_MAX : (({1} == 1.0f) ? {1} : (1 / {1}));", "rcp": "{0} = ({1} == 0.0f) ? FLT_MAX : (({1} == 1.0f) ? {1} : (1 / {1}));",
"texld": "{0} = {3}({2}, (float2){1});", "texld": "{0} = tex2D({2}, (float2){1});",
} }
struct_a2v = """struct a2v { struct_a2v = """struct a2v {
@ -186,20 +185,12 @@ def process_header(prog):
i = i - 1 i = i - 1
elif line.startswith("SetTexture"): elif line.startswith("SetTexture"):
dec = line.split(' ') dec = line.split(' ')
if dec[2] == "{2D}": if dec[2] != "{2D}":
texture_type = "sampler2D"
elif dec[2] == "{3D}":
texture_type = "sampler3D"
elif dec[2] == "{RECT}":
texture_type = "samplerRECT"
elif dec[2] == "{CUBE}":
texture_type = "samplerCUBE"
else:
raise ValueError(f"Unknown texture type {dec[2]}") raise ValueError(f"Unknown texture type {dec[2]}")
key = f"s{textures}" key = f"s{textures}"
val = dec[1][1:-1] val = dec[1][1:-1]
loctab[key] = val loctab[key] = val
locdecl.append(f"{texture_type} {val};") locdecl.append(f"sampler2D {val};")
textures = textures + 1 textures = textures + 1
del prog[i] del prog[i]
@ -226,7 +217,7 @@ def resolve_args(args, loctab, consts):
arg = arg[:dot] arg = arg[:dot]
else: else:
swiz = "" swiz = ""
if arg[0] == 'r': if arg[0] == 'r':
pass pass
elif arg[0] == 'v': elif arg[0] == 'v':
@ -247,23 +238,7 @@ def resolve_args(args, loctab, consts):
args[a] = neg + arg + swiz args[a] = neg + arg + swiz
def get_cgtex_type(name, locdecl): def decode(code, args):
for loc in locdecl:
loc = loc.split(' ')
if name == loc[1][:-1]:
if loc[0] == 'sampler2D':
return "tex2D"
elif loc[0] == 'sampler3D':
return "tex3D"
elif loc[0] == 'samplerCUBE':
return "texCUBE"
elif loc[0] == 'samplerRECT':
return "texRECT"
else:
raise ValueError(f"Unknown CG texture type {loc[0]}")
raise ValueError(f"Could not find texture {name} in locals")
def decode(code, args, locdecl):
if code in decls: if code in decls:
return [decls[code].format(*args)] return [decls[code].format(*args)]
elif code in ops: elif code in ops:
@ -278,18 +253,14 @@ def decode(code, args, locdecl):
else: else:
swiz = "xyzw" swiz = "xyzw"
if code == "texld": lines = [ops[code].format("tmp", *args[1:])]
lines = [ops[code].format("tmp", *args[1:], get_cgtex_type(args[2], locdecl))]
else:
lines = [ops[code].format("tmp", *args[1:])]
for c in swiz: for c in swiz:
lines.append(f"{target}.{c} = tmp.{c};") lines.append(f"{target}.{c} = tmp.{c};")
return lines return lines
else: else:
raise ValueError(f"Unknown opcode {code}") raise ValueError(f"Unknown opcode {code}")
def process_asm(asm, loctab, locdecl): def process_asm(asm, loctab):
shadertype = "" shadertype = ""
if asm[0] == "\"vs_1_1": if asm[0] == "\"vs_1_1":
shadertype = "vertex" shadertype = "vertex"
@ -322,7 +293,7 @@ def process_asm(asm, loctab, locdecl):
code = code[:pp] code = code[:pp]
resolve_args(args, loctab, consts) resolve_args(args, loctab, consts)
disasm = decode(code, args, locdecl) disasm = decode(code, args)
# print(f"{instruction} \t==>\t{disasm}") # print(f"{instruction} \t==>\t{disasm}")
disasm.insert(0, f"// {instruction}") disasm.insert(0, f"// {instruction}")
translated.extend(disasm) translated.extend(disasm)
@ -345,7 +316,7 @@ def disassemble(blocks):
binds.update(bds) binds.update(bds)
lighting |= light lighting |= light
(shadertype, disasm) = process_asm(asm, ltab, locdecl) (shadertype, disasm) = process_asm(asm, ltab)
shaders[shadertype] = disasm shaders[shadertype] = disasm
text = "" text = ""

View File

@ -3,7 +3,7 @@
import os import os
import sys import sys
from .swapper import process from swapper import process
def process_file(filename, suffix): def process_file(filename, suffix):
dot = filename.rfind(".") dot = filename.rfind(".")

View File

@ -5,7 +5,7 @@
import re import re
import sys import sys
from .disassembler import disassemble from disassembler import disassemble
tabs = 3 tabs = 3
def indent(block): def indent(block):