Changeset View
Changeset View
Standalone View
Standalone View
source/blender/windowmanager/intern/wm_stereo.c
| Show First 20 Lines • Show All 47 Lines • ▼ Show 20 Lines | |||||
| #include "WM_types.h" | #include "WM_types.h" | ||||
| #include "wm.h" | #include "wm.h" | ||||
| #include "wm_draw.h" | #include "wm_draw.h" | ||||
| #include "wm_window.h" | #include "wm_window.h" | ||||
| #include "UI_interface.h" | #include "UI_interface.h" | ||||
| #include "UI_resources.h" | #include "UI_resources.h" | ||||
| static eGPUInterlaceShader interlace_gpu_id_from_type(eStereo3dInterlaceType interlace_type) | |||||
| { | |||||
| switch (interlace_type) { | |||||
| case S3D_INTERLACE_ROW: | |||||
| return GPU_SHADER_INTERLACE_ROW; | |||||
| case S3D_INTERLACE_COLUMN: | |||||
| return GPU_SHADER_INTERLACE_COLUMN; | |||||
| case S3D_INTERLACE_CHECKERBOARD: | |||||
| default: | |||||
| return GPU_SHADER_INTERLACE_CHECKER; | |||||
| } | |||||
| } | |||||
| void wm_stereo3d_draw_interlace(wmWindow *win, ARegion *ar) | |||||
| { | |||||
| bool swap = (win->stereo3d_format->flag & S3D_INTERLACE_SWAP) != 0; | |||||
| enum eStereo3dInterlaceType interlace_type = win->stereo3d_format->interlace_type; | |||||
| /* wmOrtho for the screen has this same offset */ | |||||
| float halfx = GLA_PIXEL_OFS / ar->winx; | |||||
| float halfy = GLA_PIXEL_OFS / ar->winy; | |||||
| GPUVertFormat *format = immVertexFormat(); | |||||
| uint texcoord = GPU_vertformat_attr_add(format, "texCoord", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); | |||||
| uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); | |||||
| /* leave GL_TEXTURE0 as the latest active texture */ | |||||
| for (int view = 1; view >= 0; view--) { | |||||
| GPUTexture *texture = wm_draw_region_texture(ar, view); | |||||
| glActiveTexture(GL_TEXTURE0 + view); | |||||
| glBindTexture(GL_TEXTURE_2D, GPU_texture_opengl_bindcode(texture)); | |||||
| } | |||||
| immBindBuiltinProgram(GPU_SHADER_2D_IMAGE_INTERLACE); | |||||
| immUniform1i("image_a", (swap) ? 1 : 0); | |||||
| immUniform1i("image_b", (swap) ? 0 : 1); | |||||
| immUniform1i("interlace_id", interlace_gpu_id_from_type(interlace_type)); | |||||
| immBegin(GPU_PRIM_TRI_FAN, 4); | |||||
| immAttr2f(texcoord, halfx, halfy); | |||||
| immVertex2f(pos, ar->winrct.xmin, ar->winrct.ymin); | |||||
| immAttr2f(texcoord, 1.0f + halfx, halfy); | |||||
| immVertex2f(pos, ar->winrct.xmax + 1, ar->winrct.ymin); | |||||
| immAttr2f(texcoord, 1.0f + halfx, 1.0f + halfy); | |||||
| immVertex2f(pos, ar->winrct.xmax + 1, ar->winrct.ymax + 1); | |||||
| immAttr2f(texcoord, halfx, 1.0f + halfy); | |||||
| immVertex2f(pos, ar->winrct.xmin, ar->winrct.ymax + 1); | |||||
| immEnd(); | |||||
| immUnbindProgram(); | |||||
| for (int view = 1; view >= 0; view--) { | |||||
| glActiveTexture(GL_TEXTURE0 + view); | |||||
| glBindTexture(GL_TEXTURE_2D, 0); | |||||
| } | |||||
| } | |||||
| void wm_stereo3d_draw_anaglyph(wmWindow *win, ARegion *ar) | |||||
| { | |||||
| for (int view = 0; view < 2; view++) { | |||||
| int bit = view + 1; | |||||
| switch (win->stereo3d_format->anaglyph_type) { | |||||
| case S3D_ANAGLYPH_REDCYAN: | |||||
| glColorMask((1 & bit) ? GL_TRUE : GL_FALSE, | |||||
| (2 & bit) ? GL_TRUE : GL_FALSE, | |||||
| (2 & bit) ? GL_TRUE : GL_FALSE, | |||||
| GL_FALSE); | |||||
| break; | |||||
| case S3D_ANAGLYPH_GREENMAGENTA: | |||||
| glColorMask((2 & bit) ? GL_TRUE : GL_FALSE, | |||||
| (1 & bit) ? GL_TRUE : GL_FALSE, | |||||
| (2 & bit) ? GL_TRUE : GL_FALSE, | |||||
| GL_FALSE); | |||||
| break; | |||||
| case S3D_ANAGLYPH_YELLOWBLUE: | |||||
| glColorMask((1 & bit) ? GL_TRUE : GL_FALSE, | |||||
| (1 & bit) ? GL_TRUE : GL_FALSE, | |||||
| (2 & bit) ? GL_TRUE : GL_FALSE, | |||||
| GL_FALSE); | |||||
| break; | |||||
| } | |||||
| wm_draw_region_blend(ar, view, false); | |||||
| } | |||||
| glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); | |||||
| } | |||||
| void wm_stereo3d_draw_sidebyside(wmWindow *win, int view) | void wm_stereo3d_draw_sidebyside(wmWindow *win, int view) | ||||
| { | { | ||||
| bool cross_eyed = (win->stereo3d_format->flag & S3D_SIDEBYSIDE_CROSSEYED) != 0; | bool cross_eyed = (win->stereo3d_format->flag & S3D_SIDEBYSIDE_CROSSEYED) != 0; | ||||
| GPUVertFormat *format = immVertexFormat(); | GPUVertFormat *format = immVertexFormat(); | ||||
| uint texcoord = GPU_vertformat_attr_add(format, "texCoord", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); | uint texcoord = GPU_vertformat_attr_add(format, "texCoord", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); | ||||
| uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); | uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 2, GPU_FETCH_FLOAT); | ||||
| ▲ Show 20 Lines • Show All 365 Lines • Show Last 20 Lines | |||||