Skip to content

Commit 0b637ee

Browse files
committed
test_sdl2
1 parent 609c7c4 commit 0b637ee

File tree

1 file changed

+310
-0
lines changed

1 file changed

+310
-0
lines changed

src/test_sdl2.py

Lines changed: 310 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,310 @@
1+
try:
2+
__import__("os").chdir(__import__("tempfile").gettempdir())
3+
except:
4+
__import__("os").chdir("/tmp")
5+
6+
def fs_decode(fsname, o248):
7+
import os
8+
path = fsname.rsplit('/')
9+
for i in range(len(path)):
10+
try:
11+
os.mkdir('/'.join( path[0:i] ))
12+
except:
13+
pass
14+
with open(fsname, "wb") as fs:
15+
for input in o248.split("\n"):
16+
if not input:
17+
continue
18+
fs.write(bytes([ord(c) - 248 for c in input]))
19+
20+
21+
fs_decode('./blob.png','''
22+
ƁňņĿąĂĒĂøøøąŁŀļŊøøøƗøøøƗĀûøøøLjƽdzNJøøøđŬĽŐŬĻŧťťŝŦŬøĻŪŝřŬŝŜĘůšŬŠĘĿŁŅňŏŹĆďøøøāŨŀőūø
23+
øĦěøøĦěùŰƝķŮøøøŀňńŌĽĿŨńƆŕĹƾžƓƱŲŏýüüùùùǷƦǁûûûúúúúúúĘĎČıĠĠǥƚƳǐƋƢƗŠłŇĴĸţłļűœśƳŸƋƋš
24+
ůƠŮžDzDzDzƦƥƥǍǍǍŀœţģøøøĂŬŊņŋøǷǷǷƝǷǷǖśĚLJŽŰŧøøĆƵŁļĹŌŰǒǜŔƃŪǢİĊƕĀƄĹćǣđǰǷķǕǦƎŜǃƮĜńŨDžŦǍĢ
25+
ƯžżİǠưƗƟœǥDZǟƗǷƯǭŰĴǶįŹǕũŕƧǛƸĿŔǏǣǵǶħěĕDZƨőǴƖŶŭýŘøťǫǓǩǗļİŌĎǚĻƑƅĻųƅƫĔŁƢŏČǫƁĮƨƾěŘǩǬĥǴ
26+
ĿĴǦƠdžǍĝƾĒƛǟǃĊļưƦĈţĪŸǣƱĚċǎųǟĺǨĶĨƽƔƿƅƿĊƳāņġĝƝƺƽŐƨŴǠħĖĥûŽDzůŰƔūřùƒſƕǝąŎŲǩǃĮüƖƽƯƏýĸƑ
27+
ăŮĉĜƯŎƃþŞƈǟǵūŬƠĤŃƸĮųǗŦƂƏƊǫǢǎŒƹƒƤøǰĈơźĹƄŨǏijƄėƻīƖġűƋǍťōĮĻśûƋƯdžƊĤŰƕǩƽƗʼnĕƬĤĤŻǮǂƋƲķú
28+
ǠijƳIJǴĸťŻǢŚƃŰƔǫĎǔƁƫǥŧŨġƬŏĎDŽėøŢǎǖČDŽŇżƯǐŀNJĄƎƫƨƷǥǔżĿāƆėŽśøǐĬģĝDzǚĥŮĞŴĤƀőƹōŭǠƇĥƨăĈnjǃć
29+
ŁćǭŃúüýŪǏƲžǵùĖƑŘûƘüŭƑǓğǰĐľĻNjưĝğžƇDžćśğƲĸǍþđķƢǖƍźűǕŚěƴķžǠĢƸøƾƜŦėāLjƉøģǦǦĬǷƃǨŞŸŚćňź
30+
ƱżǓǙƍüĀŷƼǵĆŘǘŷčŖijDŽǰǜƃƪƎőŒĒƞĈƛįùŋDZħżƏùŦĝǀŊŨƙŵƉĉĔúǠĈĂƯņčŧÿǪǓǩģĎƻŏøŝǴňƫĐĶśǢĐĸúěǴƔą
31+
ǙŻǰŏƢĥŤňDžēıłōƙƼƿƒƦźǡƃŤøƧŭƖİśČƘƌƜǧŹŗŇǙƠľĝŃğįĔƤŔǤĖƏǤžĎĬùŬǚƐŜʼnƻǨěŹĕƦƟĨšƖúĭǜũƲšĉùĥĂ
32+
ǦƺƛēĘŸĶţŐĽľīƔǀǪùƋŚƁĠŝľƍǝěǗǚĻŒƕźǬøĴijŋǣīǃĈŘljŜLJŻũƃƼƜǢDZŧƁǧĎĭƄƗƘĽƞƜǏƋĂƝĩǫŰƪėĪİĢīǖżƎƭ
33+
ÿƙƃļŸūőĨŖŇŹůŕƂĜċƊƲLjƇƱžėƳøƁŴƚŻĜƬŦƦƒƬƟǧǦşƁćDZēƎŠāŖǀǓǐįűưǀĩĩńƿƂŁÿĿǦĴƖěĶŦƙƦǬřĆğƐĺŰƤŪ
34+
ǗøüƿōţŸŐƜþǴĠĄĩǛǵĔŴƖƱƺǎƉĶƃǟǧǣǭǤƨƲƐăŻďƔţĝǏþđķńƗźǧƒƕŚǁŞŀĽǤħƤƏƾƄLjĎŖƀƽĝǏơúĥĺĆƠùƻDžǭĜǩ
35+
ĥŹĤŎėDzƏĎǒřƫǦřļāĠƔƀĵĸňŻĶƹĻǦǛźħıĚŴƤŶǵǶĶƗħĊƘšŐƘĪŌŻƶŶƗŲǙdžīĸƑƢƮǩĬǭƢƔĠĬƁǧƝƹüŷĻƳƂƺǕǭċƝ
36+
ǴĬƐŭǞƈĶŷČijƹĻĎǭǂźĶûĶǨƅǨdzţƓŌŗĊřƆŞǨżŘšŝĉŪNJƯĐûƧŗÿƷƀŇťǩƉǴŬƫƦŭźƔǠýģŖŎƱąĊǘǏǰŊNJĠčÿǮǯĺdzƻ
37+
ƅƭŤƁćƥƸœdzƄŚƦǰƱǛǗĢƐnjǣǎǰǨŋƋǚĸĹƴŖšǂǠǜħŰĩƜǘƒƗśęĵǔLJĭƷǠƐźĄėŕƘřŶŢùǞǁŐţǯęǭđǰƺƎǝűǔąDŽĂįŧƀ
38+
ƇŲĎƖƤČŵǐįǒēǦǓĈĵǎǨŝŲĸŬŋĮƛėǔûŒġƒơơĎNJğİǀŀŴűŃǚƍŇŕʼnljŦƕƺčǞǭƓǚŃƻŷơũǭĭĶƯħĪĜƫľøIJǏĜÿŠŒljŀƫ
39+
ēǍĦƽČįĶdžƸğƣnjƦǏǎƸǰǯǂǙƱċŽǰįĆĪƬǩƵģǂljƱĉǘǃĻǙĚǒʼnŠŰǴŏǨƽǞƂƩĖţĆljǪŪǩŝdzŝǮǗLJǩùĸIJŃƸźƶǍƣƎŘƑŗĝ
40+
ĈƤƅǤėǩùĸĤŁŽĆǥĆǀƯāżǠǍŗǩʼnĿƼǭǶǮǣüĪǟįŭdzǓǢǏǀŗdzÿLjǟśǰǶĠǗŧǵŻƆđǔƳĦƗŌĦİćƶĒĎƎŵŠƱƧāŘĆLjƕťơƀDŽ
41+
ąĈƲƕƻƾǘƷĞLjǏƔŸœĉŚıƙƔƳĘǒżśĀĝǶǡůǰǨǠǓƬǩġǤƟźƃēśĥĖǬűēųŨǮƈƻŷLJǷƠƶĬƦǝĘŌśţĀƷŪĶƁōƎüŒǟûčǯǝŗ
42+
ĮǑŪŹŌīĸNJƇǑĺÿŧĩĻƯƩŨƖųČĉňǎDžƳƾijĝīŲġűǓljýǣǃŧēĀƇƮÿŋƛƛǦǐnjǃǍƤƇħǨīIJŤūĂǖęƙīƭœĩĭƩƍƥǥǓƘėdžŠĈ
43+
ĵĎƆħǯĝƦńžƌŜƭøƽĉŽƶøŇǡćƍĔŹƥijdžǠŵĞŃĚƎşŘʼnūƻĊāŬǏƁŇǠŦŤŀǶƞƄœņDZŅŪċŗǰăĊŠƥDzƹŧĴƝùƵĀŨŽĈǁƓLJœƽ
44+
ǪDŽƌſřŐĞůƒƏşüƏĺŸƱĿƱĈŸĺĸĹļĻĬŝƳǀĮƂǖƽDZſƫĞƽƈƽǰƭüǩĠūŮʼnơŐƆĐŃƙƞųƿǤƟĬğŏĩľħĥŪIJŧʼnnjǙǞřśŋƞǚǖ
45+
ĭǥǪƫƤŧNjƿǂƆńŵŰżƨņĤƃſśʼnŦǓơśİǁűǃĮƬƓćÿŌǤěœƔĚƣďşƎůþŠĚƴīǟģĉǘŘǑŮőŚŏdzĔĿƼƞǁĈĀǖƁǒŵǨƉǛǴǡŚź
46+
ǫƂƟdžĸǤŝƒǯƂƿǝŰƢLjǜÿƼădžŻįŊĉţƈűǢĽƻDZĭĈěǝǒŲƇƿūňƀżŰİǖżďŕǯĜŰǩƨĎńLJljżŻĀƣěĢDzdžǓĬūǀƱĈŒǣǬďŅþŅ
47+
ƿnjƟĕǥăǣơǀņǟǗǒǦŭǤŸǖƏûƉŔēǏƢųŝƔƝƻƑdžŋþćƄĢƆǭĤħćǛŔơǢǘƵĭŘŭĘķţƓýƔŌƢƐƓǵǪŴƒŻǤƂĉĬúŀĿŻřħĺIJİ
48+
ƽƛŋǴŏNjƤƄſǍĬǬĪĪǞăŹǫĬÿūŷLjǏũŰǒƦÿĭĈĻƔƹƠùŜƄōĞŮƊœƿŰđƇLJƧĪƭŘŋďdzǟƿƀŚŘƎǏǟăþĉſǠNjƚżŎĄIJưƤŋŻƉ
49+
ƻưƥźǏǰƠƔƃƸƮƩƠǠƠƿǩģĵŕŘŅŸǪĿǏÿijŞęƧǎƊijŝǡƪĦĆĢƍIJŮijƤłƝĩǥNJøŠĴŝŔƍǦǐǷǛƺĈƺǃƽňĥĥǰŲǦƁǖĬƏƁŖŷǚ
50+
ǒƔƳǀŭŀƞǰŞĤdzŠűǒŕƳŅƦũĚęƔńŌĮŘąƨǷŐƸŃįøǧúņŒŚĕŕƫýĞāƲǐƫƭĐČƑijŸąŜƦƛĐǔĶčƾǡŋĈēŸƳŔǪǶǛŚŴĚƁǯĪ
51+
ùĸƲƼǨąǫƈœŗƝƮƾŘNjDŽżţĐśƬNJƈƞłƢǠŪƏśĮļŔƎǫƺıļŶijłĈƜǁůǁŁƩŅǖĀĩDŽĂřƕūœŀģƣŃƙüşşĒŅĨđĿƋłĔśčǗĝǝ
52+
ƞĵũƋdzƵĹšƌǏĘĖÿǟŢźƻŁĊĥŀƩƈĘƳƕĹƢĭƫĚŷüħŻăƯœŸdzƲƙĐŤŨƃƎƵĝƛſĤĻLJİüƼŁřĒŶŽNjǭġŖĀśǍƳʼnLjİNjžĢƖƸŷ
53+
įšǚƪŒƒŏŰƱŜĭĝIJďDŽǴĔŻǎǐŝĻƤĘĬĶŇŹđǧǕƉƞǢǤğŴǔļǟĭĶŜùƍŋŁƭĹƾłƄƅğijĘđċǡŚſƒƶĩƙǨŵǮĈǶƚŷƞšǮťŖǣƓ
54+
ŀǍāėƠŅśøņƼƁĤƃĀřİĴƛIJœƙƠNJČƆĩŪłǚƣƏąŊǥǍƳŹƁŋŒżǎýŎƲDŽǙƞıƕğǥǡųƪĘƄǕŖĬƣĦƱǂƻƅƸǤŢŧĔǧǡŃƻǯǴǘũ
55+
ŇƻſƘŝljģŒǍĉĸŵĶǫŦǙŔřǵƔƊĺĜƼNJņŇƚşżŅŨƂƖĊŒŷǭƳŒƴžƇċƳǙDžƆŠĩĊơŐǴIJźĦúńƇƕDžƣďĄùƘƠǚûþŞƼƦęňėƁń
56+
ĠćăũdzśƿśƌƥƐǘĕĊŧĜŎǔƶƫƏąǣǴŠljǨƜŃĻljǥDzŦƤĔƻǨƀŇưǶřǢƗƹýƂƇũİƮķİťDZLjňŨƺƟĆIJŀǨƥǍŴƲĉNJĘƍŐĵŸƦǚƻ
57+
ĉėļķƺůĘƺưŌĤƭƗƧǔĥċǁıŪĿǥŲøģúƄǰŊƇƝƽNjnjĚİœŚċƞƪŶƒƃIJĝĵāĢljƼǏıńŅǨŸijƽÿĊǡűœŀƭķėħǢĖŭĜƀǟŞǛƟǰ
58+
NJūIJǩƙďƙDžijĈNjǴIJŅNjņźĴűƁŢDžǥǬǨĩǑŶƄƀŧƹŅDZƣƳǎǰƄĐƲĊüùǪLJǜƏǘĉǁǵŀƏĉǰDzĵʼnĴţƸŒǕǏǩċDZčNJģǕřăĞƷħžů
59+
ćŇƿþŞœƻDzĻŴljĭƼƞljƨāĘǵǨĺǵƹǬƂņƺƣƛũũĵĽąƗťǙŃǚĻŮƫĀǁŌŚĨŷėŕŞőǫŬǠŋƫĞŕƭķǀƶƲžħĿĎŴǞǛǟƬƝǓǖǐǨŗ
60+
ƖdzƯƪŒēđĶįŠņőŴǣƺƪǡĖīĶŏƹƏƄćƽşdžƽƏĿǟŝĈǰŨŞǞŽřƗŸƯǰƂǡǀƤŕŅĝĂžƲƗǡČŴŞǖƇŢŗƕĽDZŤǩŻŴĵŜĨŃĬƯŴźď
61+
ƁįĭƲƨƾƇŗǰƧƄƹdzƧǶƕDŽǰǠđŘƪĥĤþŬŽǙƏǰŴņƇƽūźǰĖįNjƝƭƞǚǗýĮƓǧƚżķğƒıņğýƿşƌŋŦŰŎǰšƁħƀǝǒĤĵżƟŷǒǨ
62+
ǎăǩōŧĘǗƺĬųŨĄĐāŗĄįƲōĘƽǨŏǔăŃŜƑĖƆĵĆƧƂŧŻĮǩżČĩĠŪǝǠƙţǟƺƀćąĤƋņʼnnjƭǬǤǫÿǨĆǘģĜƀŊĻſĭǀšŔėƗŨƆ
63+
ǔŸƏƿĨļőĘƨƔƂħùĬƼǮǁǘƉnjƘŴŢǍƿźħƂǂĦƖǧǛijŘǍưǡƈƯƖęČŧƼƍǖēĂƈǫħǎŏdžŤƗƿǤƧŁĤƚŲǤƗǭǃśĄĞōǟċčƚųNjĂ
64+
ƹƝǮŒǚģĘƥŷĢƦŔǐŶĂǴŀŢĬŧǚƃǷƗüƋĄďŦĝĖưĉƲšûǙƪųđĦųļĻǵƟŬŝŌǩĬőęDŽĺǴǣûơĜǙźůĈƳLjĴƩljšƢęǒƵŤƌƷĮƻ
65+
ǂƍČĎăŧƙúƊƯĞŔĮǤŚŐƜđķŜƧljǯǰǎIJǕŗDZƗǞƦŮǏĹĈžŖƻǀČƊƢǁŵǷşƵŏŨňŠǃƿƮüƲķƃśŪŮŠƝƖĚǃƺűĩƺƒċŅīğğŦų
66+
ǮƌƊǨƝƀüŴƄŗĈŴňƾƿŜņŦƁǙƩļǙƯżŇǝĉŹŒŢúĶāşƼĘƸŦDŽƇǠŶƯƳĞůįƸıňļĉƲŁDzńŒŞùƝŐŬƯīƢŻğŨąǰøČþƠĜÿLJIJ
67+
ĢſźĎŻžƐĠƗǖǦÿljďŊǮǪǣƼǣŸŸƧŬŵġǙśýǪţƍĵŞǤŭřúƽǚƻÿǂƀƢŠǡĠūNjƿûƱŗǨýøŞŎŅdžǃņŒŶŀāŰŞĚǜùĒĮDZăƚøŬ
68+
DŽDzĤŷƲƖijČœĂǁǡǩĖƶǴŕčŗƭƝƉƊǟņŴĜŊǪĉƏǡģƮǜǰīʼnǫǡƻğƿŮƻǰƢŎǶǨǨŮǙƛǕƮĝƧƝƎĄŷŰŪŋƛƅǪǯļƪøĄƿĿDZĻljĩ
69+
ùĶǂėłƥƾƻśƂĿŋljğĠĻǭǠĕŀǗĴƻdzœƜŧĴĶĞĵťƓǓžűǗŤǰƖīǛŻƻƈƿǙŬƒIJƇļÿƏĢƘăůŦņĸǴƬďŽǬŊŠĶǟŵNjŋƺǟţŝʼnŽ
70+
ŕƚƚƄǣŷŀþDžƬʼnƜĺǛĢĞĤŃąģļǵƸƜijœŧƲƟƞŹǘƚėĈŬŨŠDzŮǴŞĴĻĠƴƒǤơėƥƷœūDZnjƦčŽīǛūŲǝƤǰdžǕƥřDzĶŷſųĝƃłDŽ
71+
ǡćǮǨǞǮǷǖǀƺĨţǯǫǵƗŤťƩĒťǓDŽįŖǁĶǒšǝǮŤŭǚǃǮǏŪűťǧŅLJljǁǏſķƮǢĮƫƺĎǗŒǷǗŶƤƙƛƳƴŵĎƺǣDzĴŦĪŠŢdzƽŧťǎ
72+
ƪŋŁƳƥŶǗǭǧĵŹǍǯưǎǮČťǎķŐĐřŷƨǃƭƥĔŸƶśøøøøŁĽņļƦĺŘź''')
73+
74+
# ./main.py
75+
"""
76+
Python & Pygame implementation of pressure-based soft body paper
77+
https://www.researchgate.net/publication/228574502_How_to_implement_a_pressure_soft_body_model
78+
"""
79+
import asyncio
80+
from dataclasses import dataclass
81+
from math import pi, sin, cos
82+
83+
import pygame
84+
from pygame import Vector2
85+
import pygame._sdl2.video as sdl2
86+
87+
88+
async def main():
89+
90+
WINDOW_WIDTH = 750
91+
WINDOW_HEIGHT = 750
92+
MAX_FPS = 165
93+
GRAVITY = 9.81
94+
DT = 1.0 / 60.0
95+
KS = 130.0
96+
KD = 20.0
97+
RESTITUTION = 0.1
98+
PRESSURE = 300.0
99+
100+
pygame.init()
101+
window = pygame._sdl2.video.Window(title="Pygame Pressure-based Softbody", size=(WINDOW_WIDTH, WINDOW_HEIGHT))
102+
renderer = pygame._sdl2.video.Renderer(window)
103+
clock = pygame.Clock()
104+
is_running = True
105+
106+
107+
@dataclass
108+
class MassPoint:
109+
position: Vector2
110+
velocity: Vector2
111+
force: Vector2
112+
mass: float
113+
mouse: bool = False
114+
115+
@dataclass
116+
class Spring:
117+
a: MassPoint
118+
b: MassPoint
119+
length: float
120+
normal: Vector2
121+
mouse: bool = False
122+
123+
124+
masspoints: list[MassPoint] = []
125+
uvs = []
126+
springs: list[Spring] = []
127+
128+
n = 18
129+
r = 6.0
130+
for i in range(n):
131+
masspoints.append(MassPoint(
132+
Vector2(
133+
37.5 + r * sin(i * (2.0 * pi) / n),
134+
37.5 + r * cos(i * (2.0 * pi) / n)
135+
),
136+
Vector2(),
137+
Vector2(),
138+
1.0
139+
))
140+
uvs.append(
141+
Vector2(
142+
(sin(i * (2.0 * pi) / n) + 1) / 2,
143+
(cos(i * (2.0 * pi) / n) + 1) / 2
144+
)
145+
)
146+
147+
for i in range(n):
148+
a = masspoints[i - 1]
149+
b = masspoints[i]
150+
springs.append(Spring(
151+
a,
152+
b,
153+
(b.position - a.position).length(),
154+
Vector2()
155+
))
156+
157+
ground = 65.0
158+
159+
def step(dt: float) -> None:
160+
# Apply external forces
161+
for p in masspoints:
162+
if p.mouse: continue
163+
164+
p.force += Vector2(0, p.mass * GRAVITY)
165+
166+
# Apply spring forces
167+
for s in springs:
168+
delta = s.a.position - s.b.position
169+
dist = delta.length()
170+
if dist == 0.0: continue
171+
172+
rv = s.a.velocity - s.b.velocity
173+
f = (dist - s.length) * KS + (rv.x * (s.a.position.x - s.b.position.x) + rv.y * (s.a.position.y - s.b.position.y)) * KD / dist
174+
175+
force = (delta / dist) * f
176+
177+
s.a.force -= force
178+
s.b.force += force
179+
180+
# Delta perp?
181+
s.normal = Vector2(
182+
(s.a.position.y - s.b.position.y) / dist,
183+
-(s.a.position.x - s.b.position.x) / dist
184+
)
185+
186+
# Calculate valume
187+
volume = 0.0
188+
for s in springs:
189+
if s.mouse: continue
190+
191+
delta = s.a.position - s.b.position
192+
dist = delta.length()
193+
194+
volume += 0.5 * abs(s.a.position.x - s.b.position.x) * abs(s.normal.x) * dist
195+
196+
#print(volume)
197+
198+
# Apply pressure forces
199+
for s in springs:
200+
if s.mouse: continue
201+
202+
delta = s.a.position - s.b.position
203+
dist = delta.length()
204+
205+
pressure = dist * PRESSURE * (1.0 / volume)
206+
207+
s.a.force += pressure * s.normal
208+
s.b.force += pressure * s.normal
209+
210+
# Semi-implicit euler integration
211+
for p in masspoints:
212+
if p.mouse: continue
213+
214+
p.velocity += p.force / p.mass * dt
215+
216+
# Solve collisions before integrating velocities
217+
dy = p.position.y + p.velocity.y * dt
218+
dx = p.position.x + p.velocity.x * dt
219+
if dy > ground or dy < 0:
220+
p.velocity.y *= -RESTITUTION
221+
if dx > 75 or dx < 0:
222+
p.velocity.x *= -RESTITUTION
223+
224+
p.position += p.velocity * dt
225+
226+
# Reset force accumulator
227+
p.force = Vector2()
228+
229+
mouse_p = MassPoint(Vector2(), Vector2(), Vector2(), 1.0, mouse=True)
230+
mouse_spring = Spring(None, mouse_p, 0.0, Vector2(), mouse=True)
231+
232+
image = pygame.image.load("blob.png")
233+
tex = sdl2.Texture.from_surface(renderer, image)
234+
235+
236+
paused = True
237+
238+
while is_running:
239+
dt = clock.tick(MAX_FPS) / 1000
240+
241+
mouse = pygame.Vector2(*pygame.mouse.get_pos())
242+
243+
for event in pygame.event.get():
244+
if event.type == pygame.QUIT:
245+
is_running = False
246+
247+
elif event.type == pygame.MOUSEBUTTONDOWN:
248+
springs.append(mouse_spring)
249+
paused = False
250+
251+
min_d = float("inf")
252+
for p in masspoints:
253+
if p.mouse: continue
254+
255+
d = (p.position - mouse / 10).length()
256+
if d < min_d:
257+
min_d = d
258+
mouse_spring.a = p
259+
260+
261+
elif event.type == pygame.MOUSEBUTTONUP:
262+
springs.remove(mouse_spring)
263+
264+
mouse_p.position = mouse / 10
265+
266+
if not paused: step(DT)
267+
268+
#window.fill((255, 255, 255))
269+
renderer.draw_color = pygame.Color(255, 255, 255)
270+
renderer.clear()
271+
272+
#for p in masspoints:
273+
# pygame.draw.circle(window, (255, 0, 0), p.position * 10, 5, 0)
274+
275+
#pygame.draw.polygon(window, (0, 255, 0), [p.position * 10 for p in masspoints if not p.mouse], 0)
276+
277+
#for s in springs:
278+
# pygame.draw.line(window, (15, 125, 70), s.a.position * 10, s.b.position * 10, 3)
279+
280+
#pygame.draw.line(window, (170, 170, 170), (0, ground*10), (750, ground*10), 1)
281+
282+
c = Vector2()
283+
for p in masspoints:
284+
if p.mouse: continue
285+
c += p.position
286+
c /= n
287+
288+
m = [p for p in masspoints if not p.mouse]
289+
for i in range(n):
290+
a = m[i]
291+
b = m[(i + 1) % n]
292+
293+
tex.draw_triangle(
294+
a.position * 10,
295+
b.position * 10,
296+
c * 10,
297+
uvs[i],
298+
uvs[(i + 1) % n],
299+
(0.5, 0.5)
300+
)
301+
302+
#pygame.display.flip()
303+
renderer.present()
304+
await asyncio.sleep(0)
305+
306+
pygame.quit()
307+
308+
309+
if __name__ == '__main__':
310+
asyncio.run(main())

0 commit comments

Comments
 (0)