本文整理汇总了Python中srctools.Vec.to_angle方法的典型用法代码示例。如果您正苦于以下问题:Python Vec.to_angle方法的具体用法?Python Vec.to_angle怎么用?Python Vec.to_angle使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类srctools.Vec
的用法示例。
在下文中一共展示了Vec.to_angle方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Python代码示例。
示例1: res_glass_hole
# 需要导入模块: from srctools import Vec [as 别名]
# 或者: from srctools.Vec import to_angle [as 别名]
def res_glass_hole(inst: Entity, res: Property):
"""Add Glass/grating holes. The value should be 'large' or 'small'."""
hole_type = HoleType(res.value)
normal = Vec(z=-1).rotate_by_str(inst['angles'])
origin = Vec.from_str(inst['origin']) // 128 * 128 + 64
if test_hole_spot(origin, normal, hole_type):
HOLES[origin.as_tuple(), normal.as_tuple()] = hole_type
inst['origin'] = origin
inst['angles'] = normal.to_angle()
return
# Test the opposite side of the glass too.
inv_origin = origin + 128 * normal
inv_normal = -normal
if test_hole_spot(inv_origin, inv_normal, hole_type):
HOLES[inv_origin.as_tuple(), inv_normal.as_tuple()] = hole_type
inst['origin'] = inv_origin
inst['angles'] = inv_normal.to_angle()
else:
# Remove the instance, so this does nothing.
inst.remove()
示例2: make_straight
# 需要导入模块: from srctools import Vec [as 别名]
# 或者: from srctools.Vec import to_angle [as 别名]
def make_straight(
origin: Vec,
normal: Vec,
dist: int,
config: dict,
is_start=False,
):
"""Make a straight line of instances from one point to another."""
# 32 added to the other directions, plus extended dist in the direction
# of the normal - 1
p1 = origin + (normal * ((dist // 128 * 128) - 96))
# The starting brush needs to
# stick out a bit further, to cover the
# point_push entity.
p2 = origin - (normal * (96 if is_start else 32))
# bbox before +- 32 to ensure the above doesn't wipe it out
p1, p2 = Vec.bbox(p1, p2)
solid = vbsp.VMF.make_prism(
# Expand to 64x64 in the other two directions
p1 - 32, p2 + 32,
mat='tools/toolstrigger',
).solid
motion_trigger(solid.copy())
push_trigger(origin, normal, [solid])
angles = normal.to_angle()
support_file = config['support']
straight_file = config['straight']
support_positions = (
SUPPORT_POS[normal.as_tuple()]
if support_file else
[]
)
for off in range(0, int(dist), 128):
position = origin + off * normal
vbsp.VMF.create_ent(
classname='func_instance',
origin=position,
angles=angles,
file=straight_file,
)
for supp_ang, supp_off in support_positions:
if (position + supp_off).as_tuple() in SOLIDS:
vbsp.VMF.create_ent(
classname='func_instance',
origin=position,
angles=supp_ang,
file=support_file,
)
示例3: make_barriers
# 需要导入模块: from srctools import Vec [as 别名]
# 或者: from srctools.Vec import to_angle [as 别名]
#.........这里部分代码省略.........
normal[norm_axis] > 0,
barr_type,
]
if hole_type is HoleType.LARGE:
offsets = (-80, -48, -16, 16, 48, 80)
hole_temp = hole_temp_large.copy()
else:
offsets = (-16, 16)
hole_temp = hole_temp_small.copy()
for u_off in offsets:
for v_off in offsets:
# Skip the corners on large holes.
# Those aren't actually used, so skip them. That way
# we can have them diagonally or without glass in the corner.
if u_off in (-80, 80) and v_off in (-80, 80):
continue
slice_plane.discard((
(u + u_off) // 32,
(v + v_off) // 32,
))
# Now generate the curved brushwork.
if barr_type is BarrierType.GLASS:
front_temp = glass_temp
front_mat = get_tex('special.glass')
elif barr_type is BarrierType.GRATING:
front_temp = grate_temp
front_mat = get_tex('special.grating')
else:
raise NotImplementedError
angles = normal.to_angle(0)
# Angle corresponding to the brush, for the corners.
angle_list = [angles] * len(hole_temp)
# This is a tricky bit. Two large templates would collide
# diagonally,
# so chop off the corners, then put them back only if there's not
# one diagonally.
if hole_type is HoleType.LARGE:
for roll in (0, 90, 180, 270):
corn_angles = angles.copy()
corn_angles.z = roll
hole_off = origin + Vec(y=128, z=128).rotate(*corn_angles)
diag_type = HOLES.get(
(hole_off.as_tuple(), normal.as_tuple()),
None,
)
if diag_type is not HoleType.LARGE:
hole_temp += hole_temp_corner
angle_list += [corn_angles] * len(hole_temp_corner)
def solid_pane_func(off1, off2, mat):
"""Given the two thicknesses, produce the curved hole from the template."""
off_min = min(off1, off2)
off_max = max(off1, off2)
new_brushes = [
brush.copy(vmf_file=vmf)
for brush in hole_temp
]
for brush, br_angles in zip(new_brushes, angle_list):
for face in brush.sides:
face.mat = mat
示例4: make_frames
# 需要导入模块: from srctools import Vec [as 别名]
# 或者: from srctools.Vec import to_angle [as 别名]
def make_frames(vmf: VMF, targ: str, conf: dict, bbox_min: Vec, bbox_max: Vec, norm: Vec):
"""Generate frames for a rectangular glass item."""
def make_frame(frame_type, loc, angles):
"""Make a frame instance."""
vmf.create_ent(
classname='func_instance',
targetname=targ,
file=conf['frame_' + frame_type],
# Position at the center of the block, instead of at the glass.
origin=loc - norm * 64,
angles=angles,
)
if bbox_min == bbox_max:
# 1x1 glass..
make_frame('single', bbox_min, norm.to_angle())
return
norm_axis = norm.axis()
u_axis, v_axis = Vec.INV_AXIS[norm_axis]
u_norm = Vec()
v_norm = Vec()
u_norm[u_axis] = 1
v_norm[v_axis] = 1
single_u = bbox_min[u_axis] == bbox_max[u_axis]
single_v = bbox_min[v_axis] == bbox_max[v_axis]
# If single in either direction, it needs a u-bend.
if single_u:
ubend_axis = v_axis
elif single_v:
ubend_axis = u_axis
else:
ubend_axis = None
if ubend_axis is not None:
for bend_mag, bbox in [(1, bbox_min), (-1, bbox_max)]:
make_frame(
'ubend',
bbox,
norm.to_angle_roll(Vec.with_axes(ubend_axis, bend_mag)),
)
else:
# Make 4 corners - one in each roll direction.
for roll in range(0, 360, 90):
angles = norm.to_angle(roll)
# The two directions with a border in the corner instance.
# We want to put it on those sides.
corner_a = Vec(y=-1).rotate(*angles)
corner_b = Vec(z=-1).rotate(*angles)
# If the normal is positive, we want to be bbox_max in that axis,
# otherwise bbox_min.
pos = Vec.with_axes(
norm_axis, bbox_min,
corner_a.axis(),
(bbox_max if corner_a >= (0, 0, 0) else bbox_min),
corner_b.axis(),
(bbox_max if corner_b >= (0, 0, 0) else bbox_min),
)
make_frame(
'corner',
pos,
angles,
)
# Make straight sections.
straight_u_pos = norm.to_angle_roll(v_norm)
straight_u_neg = norm.to_angle_roll(-v_norm)
straight_v_pos = norm.to_angle_roll(u_norm)
straight_v_neg = norm.to_angle_roll(-u_norm)
for u_pos in range(int(bbox_min[u_axis] + 128), int(bbox_max[u_axis]), 128):
make_frame(
'edge',
Vec.with_axes(u_axis, u_pos, v_axis, bbox_min, norm_axis, bbox_min),
straight_u_pos,
)
make_frame(
'edge',
Vec.with_axes(u_axis, u_pos, v_axis, bbox_max, norm_axis, bbox_min),
straight_u_neg,
)
for v_pos in range(int(bbox_min[v_axis] + 128), int(bbox_max[v_axis]), 128):
make_frame(
'edge',
Vec.with_axes(v_axis, v_pos, u_axis, bbox_min, norm_axis, bbox_min),
straight_v_pos,
)
make_frame(
'edge',
Vec.with_axes(v_axis, v_pos, u_axis, bbox_max, norm_axis, bbox_min),
straight_v_neg,
)
示例5: res_piston_plat
# 需要导入模块: from srctools import Vec [as 别名]
# 或者: from srctools.Vec import to_angle [as 别名]
def res_piston_plat(vmf: VMF, inst: Entity, res: Property):
"""Generates piston platforms with optimized logic."""
(
template,
visgroup_names,
inst_filenames,
automatic_var,
color_var,
source_ent,
snd_start,
snd_loop,
snd_stop,
) = res.value # type: template_brush.Template, List[str], Dict[str, str], str, str, str, str, str, str
min_pos = inst.fixup.int(FixupVars.PIST_BTM)
max_pos = inst.fixup.int(FixupVars.PIST_TOP)
start_up = inst.fixup.bool(FixupVars.PIST_IS_UP)
# Allow doing variable lookups here.
visgroup_names = [
conditions.resolve_value(inst, name)
for name in visgroup_names
]
if len(ITEMS[inst['targetname']].inputs) == 0:
# No inputs. Check for the 'auto' var if applicable.
if automatic_var and inst.fixup.bool(automatic_var):
pass
# The item is automatically moving, so we generate the dynamics.
else:
# It's static, we just make that and exit.
position = max_pos if start_up else min_pos
inst.fixup[FixupVars.PIST_BTM] = position
inst.fixup[FixupVars.PIST_TOP] = position
static_inst = inst.copy()
vmf.add_ent(static_inst)
static_inst['file'] = inst_filenames['fullstatic_' + str(position)]
return
init_script = 'SPAWN_UP <- {}'.format('true' if start_up else 'false')
if snd_start and snd_stop:
packing.pack_files(vmf, snd_start, snd_stop, file_type='sound')
init_script += '; START_SND <- `{}`; STOP_SND <- `{}`'.format(snd_start, snd_stop)
elif snd_start:
packing.pack_files(vmf, snd_start, file_type='sound')
init_script += '; START_SND <- `{}`'.format(snd_start)
elif snd_stop:
packing.pack_files(vmf, snd_stop, file_type='sound')
init_script += '; STOP_SND <- `{}`'.format(snd_stop)
script_ent = vmf.create_ent(
classname='info_target',
targetname=local_name(inst, 'script'),
vscripts='BEE2/piston/common.nut',
vscript_init_code=init_script,
origin=inst['origin'],
)
if start_up:
st_pos, end_pos = max_pos, min_pos
else:
st_pos, end_pos = min_pos, max_pos
script_ent.add_out(
Output('OnUser1', '!self', 'RunScriptCode', 'moveto({})'.format(st_pos)),
Output('OnUser2', '!self', 'RunScriptCode', 'moveto({})'.format(end_pos)),
)
origin = Vec.from_str(inst['origin'])
angles = Vec.from_str(inst['angles'])
off = Vec(z=128).rotate(*angles)
move_ang = off.to_angle()
# Index -> func_movelinear.
pistons = {} # type: Dict[int, Entity]
static_ent = vmf.create_ent('func_brush', origin=origin)
color_var = conditions.resolve_value(inst, color_var).casefold()
if color_var == 'white':
top_color = template_brush.MAT_TYPES.white
elif color_var == 'black':
top_color = template_brush.MAT_TYPES.black
else:
top_color = None
for pist_ind in range(1, 5):
pist_ent = inst.copy()
vmf.add_ent(pist_ent)
if pist_ind <= min_pos:
# It's below the lowest position, so it can be static.
pist_ent['file'] = inst_filenames['static_' + str(pist_ind)]
pist_ent['origin'] = brush_pos = origin + pist_ind * off
temp_targ = static_ent
else:
# It's a moving component.
pist_ent['file'] = inst_filenames['dynamic_' + str(pist_ind)]
#.........这里部分代码省略.........