From 7a61adb705fe606a4df2f13ddeb333309cc2d8fd Mon Sep 17 00:00:00 2001 From: hinus Date: Wed, 22 Jul 2020 18:33:29 +0800 Subject: [PATCH] =?UTF-8?q?Summary:=20=E9=87=8D=E6=9E=84draw=20library=20I?= =?UTF-8?q?ssue:=20https://gitee.com/hinus/HiLang/issues/I1OQRE=20Descript?= =?UTF-8?q?ion:=201.=20=E9=87=8D=E6=9E=84draw.hi=E5=BA=93=EF=BC=8C?= =?UTF-8?q?=E5=85=A5=E5=8F=A3=E6=94=B9=E4=B8=BAhi=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E3=80=82=202.=20=E6=8F=90=E4=BA=A4=E4=B8=80=E4=B8=AA=E7=89=A9?= =?UTF-8?q?=E7=90=86=E6=A8=A1=E6=8B=9F=E7=9A=84=E6=B5=8B=E8=AF=95=E7=94=A8?= =?UTF-8?q?=E4=BE=8B=E3=80=82=203.=20=E4=BF=AE=E5=A4=8Dimport=20*=E7=9A=84?= =?UTF-8?q?=E8=AF=AD=E6=B3=95=E8=A7=A3=E6=9E=90=E9=94=99=E8=AF=AF=20LLT:?= =?UTF-8?q?=20graphics/spring.hi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/parser/parser.py | 6 ++- src/main/vm/extlib/{draw_def.hi => draw.hi} | 15 +++--- src/main/vm/extlib/hidraw.cpp | 37 +++++--------- src/test/hilang/graphics/spring.hi | 53 +++++++++++++++++++++ src/test/hilang/win.hi | 5 +- 5 files changed, 81 insertions(+), 35 deletions(-) rename src/main/vm/extlib/{draw_def.hi => draw.hi} (64%) create mode 100644 src/test/hilang/graphics/spring.hi diff --git a/src/main/parser/parser.py b/src/main/parser/parser.py index d52c823..252a310 100644 --- a/src/main/parser/parser.py +++ b/src/main/parser/parser.py @@ -1304,7 +1304,11 @@ def p_import_from(p): '''import_from : TAG_FROM dotted_name TAG_IMPORT "*" | TAG_FROM dotted_name TAG_IMPORT import_as_names''' if p[4] == "*": - pass + p[0] = ast.ImportFrom(module = '.'.join(p[2]), + names = [ast.alias(name = "*", asname = None)], + level = 0, + lineno = p.get_item(1).lineno, + col_offset = p.get_item(1).lexpos) else: p[0] = ast.ImportFrom(module = '.'.join(p[2]), diff --git a/src/main/vm/extlib/draw_def.hi b/src/main/vm/extlib/draw.hi similarity index 64% rename from src/main/vm/extlib/draw_def.hi rename to src/main/vm/extlib/draw.hi index 28fbf1f..0dae54b 100644 --- a/src/main/vm/extlib/draw_def.hi +++ b/src/main/vm/extlib/draw.hi @@ -1,3 +1,5 @@ +from libdraw import *; + class Window(object) { QUIT = 0x12; @@ -10,9 +12,7 @@ class Window(object) { return Canvas(self); } - func add_event(self, evt) { - self.events.append(evt); - } + get_events = window_get_events; } class Canvas(object) { @@ -20,9 +20,12 @@ class Canvas(object) { self.window = win; } - # some native methods; - # draw_line; - # update; + draw_line = canvas_draw_line; + draw_rect = canvas_draw_rect; + draw_circle = canvas_draw_circle; + draw_test = canvas_draw_test; + update = canvas_update; + fill = canvas_fill; } class Event(object) { diff --git a/src/main/vm/extlib/hidraw.cpp b/src/main/vm/extlib/hidraw.cpp index 29ad2f7..7f5a493 100644 --- a/src/main/vm/extlib/hidraw.cpp +++ b/src/main/vm/extlib/hidraw.cpp @@ -154,14 +154,14 @@ static void AddShader(GLuint ShaderProgram, const char* pShaderText, GLenum Shad } HiObject* canvas_draw_test(ObjList args) { - char* vs_shader = "#version 330 \n" + const char* vs_shader = "#version 330 \n" "layout (location = 0) in vec3 Position; \n" "uniform float gScale;\n" "void main() {\n" "gl_Position = vec4(gScale * Position.x, gScale * Position.y, Position.z, 1.0); \n" "}"; - char* fr_shader = "#version 330\n" + const char* fr_shader = "#version 330\n" "out vec4 FragColor;\n" "void main() {\n" "FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n" @@ -238,7 +238,14 @@ HiObject* canvas_update(ObjList args) { } RGMethod draw_methods[] = { - { "create_window", new FunctionObject(create_window), 0, "create window", }, + { "create_window", new FunctionObject(create_window), 0, "create window", }, + { "window_get_events", new FunctionObject(window_get_events), 0, "peeks all events in window", }, + { "canvas_draw_line", new FunctionObject(canvas_draw_line), 0, "draw a line", }, + { "canvas_draw_circle", new FunctionObject(canvas_draw_circle), 0, "draw a circle", }, + { "canvas_draw_rect", new FunctionObject(canvas_draw_rect), 0, "draw a rect", }, + { "canvas_draw_test", new FunctionObject(canvas_draw_test), 0, "learn opengl shader", }, + { "canvas_update", new FunctionObject(canvas_update), 0, "update canvas", }, + { "canvas_fill", new FunctionObject(canvas_fill), 0, "fill all screen", }, { NULL, NULL, 0, NULL, }, }; @@ -247,29 +254,7 @@ extern "C" { #endif SO_PUBLIC ModuleObject* init_libdraw() { - ModuleObject* mod = ModuleObject::init_module(draw_methods); - ModuleObject* draw_def = ModuleObject::import_module(new HiString("draw_def")); - - HiObject* tp_canvas = draw_def->getattr(new HiString("Canvas")); - Klass* canvas_klass = ((HiTypeObject*)tp_canvas)->own_klass(); - HiDict* klass_dict = canvas_klass->klass_dict(); - - klass_dict->put(new HiString("draw_line"), new FunctionObject(canvas_draw_line)); - klass_dict->put(new HiString("draw_circle"), new FunctionObject(canvas_draw_circle)); - klass_dict->put(new HiString("draw_rect"), new FunctionObject(canvas_draw_rect)); - klass_dict->put(new HiString("draw_test"), new FunctionObject(canvas_draw_test)); - klass_dict->put(new HiString("update"), new FunctionObject(canvas_update)); - klass_dict->put(new HiString("fill"), new FunctionObject(canvas_fill)); - - HiObject* tp_win = draw_def->getattr(new HiString("Window")); - Klass* win_klass = ((HiTypeObject*)tp_win)->own_klass(); - klass_dict = win_klass->klass_dict(); - - klass_dict->put(new HiString("get_events"), new FunctionObject(window_get_events)); - - mod->extend(draw_def); - - return mod; + return ModuleObject::init_module(draw_methods); } #ifdef __cplusplus diff --git a/src/test/hilang/graphics/spring.hi b/src/test/hilang/graphics/spring.hi new file mode 100644 index 0000000..d12b4ae --- /dev/null +++ b/src/test/hilang/graphics/spring.hi @@ -0,0 +1,53 @@ +from draw import create_window; +from draw import Window; + +myWindow = Window(create_window((600, 600))); +print(myWindow); +canvas = myWindow.get_canvas(); +print(canvas); + +class Ball(object) { + func __init__(self, x, y, r, m, k) { + self.x = x; + self.y = y; + self.r = r; + self.m = m; + self.k = k; + self.v = 0.0; + } + + func update(self) { + self.y += self.v; + + force = -self.y * self.k; + acc = force / self.m; + self.v += acc; + } + + func draw(self, canvas) { + canvas.fill((192, 192, 192)); + canvas.draw_circle((self.x, self.y), self.r, (255, 128, 128)); + canvas.update(); + } +} + +ball = Ball(0.0, 0.8, 0.08, 8.0, 0.01); + +while(going) { + sleep(20); + + ball.update(); + ball.draw(canvas); + + evts = myWindow.get_events(); + + if (evts is None) { + continue; + } + + for evt in evts { + if (evt == myWindow.QUIT) { + going = False; + } + } +} diff --git a/src/test/hilang/win.hi b/src/test/hilang/win.hi index 1758c07..cbcf163 100644 --- a/src/test/hilang/win.hi +++ b/src/test/hilang/win.hi @@ -1,5 +1,6 @@ -from libdraw import create_window; -from libdraw import Window; +from draw import create_window; +from draw import Window; + import math; myWindow = Window(create_window((600, 600))); -- Gitee