Skip to content

Commit 85a9024

Browse files
generated .vmts now save to the correct folder
1 parent a0df28b commit 85a9024

File tree

716 files changed

+2894
-29
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

716 files changed

+2894
-29
lines changed

README.md

Lines changed: 1 addition & 1 deletion

batch_vmt.py

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
#
77
# You should have received a copy of the license along with this
88
# work. If not, see <http://creativecommons.org/licenses/by-sa/4.0/>.
9-
"""generate .vmt files from a folder of .vtf files (from a template .vmt)"""
9+
"""generate .vmt files from a folder of .vtf files"""
1010
from __future__ import annotations
1111
import argparse
1212
import fnmatch
@@ -15,15 +15,15 @@
1515
from typing import Dict, List, Tuple
1616

1717
from colour import Color
18-
from gooey import Gooey
18+
# from gooey import Gooey
1919

20-
import vtf
20+
# import VTFLibWrapper
2121

2222

2323
__version__ = "1.0.0"
2424

2525

26-
def from_template(template: str, vtf_filename: str, **substitutions: Dict[str, str]):
26+
def from_template(vtf_filename: str, template: str, **substitutions: Dict[str, str]):
2727
"""Generate .vmts from `template` for every .vtf in `folder`"""
2828
# example usage:
2929
# from_template("LightmappedGeneric{$basetexture <filename>}", "materials/folder")
@@ -34,30 +34,31 @@ def from_template(template: str, vtf_filename: str, **substitutions: Dict[str, s
3434
# '$basetexture2 <texture2>' --> '"$blendmodulatetexture" "<filename>_bm"'
3535
# then at the file level: '<filename>_bm' -> 'texture_bm' for "texture.vmt"
3636
# NOTE: never put filename in replacements unless you want to replace all textures with one texture!
37-
filename = os.splitext(vtf_filename) # remove .vtf extension
37+
filename = os.path.splitext(vtf_filename)[0] # remove .vtf extension
3838
with open(f"{filename}.vmt", "w") as vmt_file:
3939
vmt_file.write(template.replace("<filename>", filename))
4040

4141

4242
# TODO: maybe separate file filtering from .vmt writing?
4343
def from_metadata(vtf_filename: str, shader: str = "LightmappedGeneric", **flags: Dict[str, Tuple[str, str]]):
44-
"""filename shouldn't have an extension"""
44+
"""generate an appropriate .vmt from .vmt flags"""
4545
raise NotImplementedError()
4646
# * EXPECTED FLAGS *
4747
# has_alpha: bool // vtf is transparent e.g. {"has_alpha": "$translucent": 1}
4848
# colour: Color // fuzzy colour detection
4949
# hue_range: float // [0-1]; how close the texture's hue should be to colour
5050

51-
filename = os.path.splitext(vtf_filename)
52-
vtf_header = vtf.Vtf.from_file(f"{filename}.vtf").header
51+
filename = os.path.splitext(vtf_filename)[0]
52+
53+
vtf = ... # TODO: load f"{filename}.vtf" with VTFLibWrapper
5354
# check flags
5455
if "color" in flags:
5556
flags["colour"] = flags.pop("color")
5657
if "transparent" in flags:
5758
flags["has_alpha"] = flags.pop("transparent")
5859
checks: Dict[str, bool]
59-
checks = {"colour": fuzzy_colour_match(vtf_header.reflectivity, flags["colour"], flags.get("hue_range", 0)),
60-
"has_alpha": vtf_header.image_format in vtf.transparent_formats,
60+
checks = {"colour": fuzzy_colour_match(vtf.reflectivity, flags["colour"], flags.get("hue_range", 0)),
61+
"has_alpha": has_alpha(vtf),
6162
None: None}
6263
# ^ {"flag": True or False}
6364
metadata = {f: checks.get(f, None) for f in flags}
@@ -79,12 +80,17 @@ def fuzzy_colour_match(a: Color, b: Color, hue_range: float) -> bool:
7980
return abs(a.hsl[0] - b.hsl[0]) <= hue_range
8081

8182

82-
def process_folder(method: str, folders: List[str], ignore=[], recursive=False, verbose=False, **kwargs):
83+
def has_alpha(vtf) -> bool:
84+
raise NotImplementedError()
85+
return vtf.image_format in (...)
86+
87+
88+
def parse_folder(method: str, folders: List[str], template=None, ignore=[], recursive=False, verbose=False, **kwargs):
8389
# pre-processing
8490
ignore_patterns = [re.compile(p) for p in ignore]
8591
if method == "template":
8692
# kwargs["substutions"]: Dict[str, str] = {"keyword": "replacement"}
87-
template = open(kwargs.pop("template")).read()
93+
template = open(template).read()
8894
# NOTE: the "template" kwarg must be supplied! [process_folder(..., template="base.vmt")]
8995
# template substitutions
9096
for keyword, replacement in kwargs.pop("substitutions", dict()).items():
@@ -98,11 +104,11 @@ def process_folder(method: str, folders: List[str], ignore=[], recursive=False,
98104

99105
# parse all folders
100106
for folder in folders:
107+
folder_contents = [os.path.join(f) for f in os.listdir(folder)]
101108
if recursive:
102-
folder_contents = [os.path.join(f) for f in os.listdir(folder)]
103109
folders.extend([d for d in folder_contents if os.path.isdir(d)])
104110
for vtf_filename in fnmatch.filter(folder_contents, "*.vtf"):
105-
filename = os.path.join(folder, os.path.splitext(vtf_filename))
111+
filename = os.path.join(folder, os.path.splitext(vtf_filename)[0])
106112
if any([pattern.match(filename) for pattern in ignore_patterns]):
107113
if verbose:
108114
print("Skipping {filename}.vmt")
@@ -111,14 +117,15 @@ def process_folder(method: str, folders: List[str], ignore=[], recursive=False,
111117
if verbose:
112118
print(f"Writing {filename}.vmt... ", end="")
113119
if method == "template":
114-
from_template(vtf_filename, template)
120+
from_template(filename, template)
115121
elif method == "metadata":
116-
from_metadata(vtf_filename, **kwargs)
122+
# TODO: do a keyword substitution pass on flags.values
123+
from_metadata(filename, **kwargs)
117124
if verbose:
118125
print("Done!")
119126

120127

121-
@Gooey
128+
# @Gooey
122129
def main(with_args: List[str] = None):
123130
notes = ["You can drag any folder over %(prog)s and just use the defaults",
124131
"--template (default: base.vmt next to %(prog)s) must have a <filename> keyword!",
@@ -134,15 +141,17 @@ def main(with_args: List[str] = None):
134141
mode = parser.add_mutually_exclusive_group()
135142
mode.add_argument("-t", "--template", default="base.vmt",
136143
help="generate vmts from the supplied template\ndefault: base.vmt")
137-
mode.add_argument("-m", "--metadata", action="store_true")
144+
mode.add_argument("-m", "--metadata", action="store_true",
145+
help="generate each .vmt based on flags set in the .vtf\nNOT IMPLEMENTED YET")
138146
parser.add_argument("-f", "--flags",
139-
help="colon separated metadata flags\n(e.g. has_alpha:$translucent:1)")
147+
help="colon separated metadata flags\n(e.g. has_alpha:$translucent:1)\nNOT IMPLEMENTED YET")
148+
# TODO: set vmt shader (default: LightmappedGeneric)
140149
# TODO: list all available flags
141-
parser.add_argument("-s", "--substitute", action="append", metavar="KEYWORD:REPLACEMENT", dest="subs",
142-
help="substitute <KEYWORD> in template with REPLACEMENT\n(e.g. `bumpmap:<filename>_bump`)")
150+
parser.add_argument("-s", "--substitute", action="append", metavar="keyword:replacement", default=[],
151+
help="substitute <keyword> in template with replacement\n(e.g. `bumpmap:<filename>_bump`)")
143152
parser.add_argument("-r", "--recurse", action="store_true",
144-
help="generate .vmts for all folders within FOLDER")
145-
parser.add_argument("-i", "--ignore", action="append", metavar="PATTERN", nargs="*",
153+
help="generate .vmts for all folders within folder")
154+
parser.add_argument("-i", "--ignore", action="append", metavar="patterns", nargs="*", default=[],
146155
help="skip <filename> if it matches any of the given patterns")
147156
# TODO: --generate (metadata based .vmt & adding / removing relevant key-value pairs [no template])
148157
# TODO: --surfaceprop choice to add a surfaceprop
@@ -157,15 +166,15 @@ def main(with_args: List[str] = None):
157166
args = parser.parse_args()
158167

159168
# if not args.metadata: # template mode
160-
replacements = {k.strip("<>"): v for a in args.replace for k, v in a.split(":")}
169+
replacements = {k.strip("<>"): v for a in args.substitute for k, v in a.split(":")}
161170
# replacements are colon separated; < & > around the keyword are optional
162171
# setting filename will give all make all .vmts generated identical! even the basetexture!
163-
process_folder("template", args.template, args.folders,
164-
ignore=args.ignore, verbose=args.verbose, substitutions=replacements)
172+
parse_folder("template", args.folders, template=args.template, substitutions=replacements,
173+
ignore=args.ignore, verbose=args.verbose)
165174
# else: # metadata mode
166175
# flags = {f: (p, v) for m in args.metadata for f, p, v in m.split(":")}
167-
# process_folder("metadata", args.folders,
168-
# ignore=args.ignore, verbose=args.verbose, flags=flags)
176+
# process_folder("metadata", args.folders, flags=flags,
177+
# ignore=args.ignore, verbose=args.verbose)
169178

170179

171180
if __name__ == "__main__":

tests/materials/0_0.vmt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
"LightmappedGeneric"
2+
{
3+
"$basetexture" "<texture>"
4+
}

tests/materials/0_1.vmt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
"LightmappedGeneric"
2+
{
3+
"$basetexture" "<texture>"
4+
}

tests/materials/0_10.vmt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
"LightmappedGeneric"
2+
{
3+
"$basetexture" "<texture>"
4+
}

tests/materials/0_11.vmt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
"LightmappedGeneric"
2+
{
3+
"$basetexture" "<texture>"
4+
}

tests/materials/0_12.vmt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
"LightmappedGeneric"
2+
{
3+
"$basetexture" "<texture>"
4+
}

tests/materials/0_13.vmt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
"LightmappedGeneric"
2+
{
3+
"$basetexture" "<texture>"
4+
}

tests/materials/0_14.vmt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
"LightmappedGeneric"
2+
{
3+
"$basetexture" "<texture>"
4+
}

tests/materials/0_15.vmt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
"LightmappedGeneric"
2+
{
3+
"$basetexture" "<texture>"
4+
}

0 commit comments

Comments
 (0)