Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/space_view3d/view3d_draw_legacy.c
| Show First 20 Lines • Show All 1,332 Lines • ▼ Show 20 Lines | |||||
| typedef struct View3DShadow { | typedef struct View3DShadow { | ||||
| struct View3DShadow *next, *prev; | struct View3DShadow *next, *prev; | ||||
| GPULamp *lamp; | GPULamp *lamp; | ||||
| } View3DShadow; | } View3DShadow; | ||||
| static void gpu_render_lamp_update(Scene *scene, View3D *v3d, | static void gpu_render_lamp_update(Scene *scene, View3D *v3d, | ||||
| Object *ob, Object *par, | Object *ob, Object *par, | ||||
| float obmat[4][4], unsigned int lay, | float obmat[4][4], unsigned int lay, | ||||
| ListBase *shadows, SceneRenderLayer *srl) | ListBase *shadows) | ||||
| { | { | ||||
| GPULamp *lamp = GPU_lamp_from_blender(scene, ob, par); | GPULamp *lamp = GPU_lamp_from_blender(scene, ob, par); | ||||
| if (lamp) { | if (lamp) { | ||||
| Lamp *la = (Lamp *)ob->data; | Lamp *la = (Lamp *)ob->data; | ||||
| GPU_lamp_update(lamp, lay, (ob->restrictflag & OB_RESTRICT_RENDER), obmat); | GPU_lamp_update(lamp, lay, (ob->restrictflag & OB_RESTRICT_RENDER), obmat); | ||||
| GPU_lamp_update_colors(lamp, la->r, la->g, la->b, la->energy); | GPU_lamp_update_colors(lamp, la->r, la->g, la->b, la->energy); | ||||
| unsigned int layers = lay & v3d->lay; | unsigned int layers = lay & v3d->lay; | ||||
| if (srl) | |||||
| layers &= srl->lay; | |||||
| if (layers && | if (layers && | ||||
| GPU_lamp_has_shadow_buffer(lamp) && | GPU_lamp_has_shadow_buffer(lamp) && | ||||
| /* keep last, may do string lookup */ | /* keep last, may do string lookup */ | ||||
| GPU_lamp_visible(lamp, srl, NULL)) | GPU_lamp_visible(lamp, NULL)) | ||||
| { | { | ||||
| View3DShadow *shadow = MEM_callocN(sizeof(View3DShadow), "View3DShadow"); | View3DShadow *shadow = MEM_callocN(sizeof(View3DShadow), "View3DShadow"); | ||||
| shadow->lamp = lamp; | shadow->lamp = lamp; | ||||
| BLI_addtail(shadows, shadow); | BLI_addtail(shadows, shadow); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| static void gpu_update_lamps_shadows_world(const EvaluationContext *eval_ctx, Scene *scene, View3D *v3d) | static void gpu_update_lamps_shadows_world(const EvaluationContext *eval_ctx, Scene *scene, View3D *v3d) | ||||
| { | { | ||||
| ListBase shadows; | ListBase shadows; | ||||
| Scene *sce_iter; | Scene *sce_iter; | ||||
| Base *base; | Base *base; | ||||
| World *world = scene->world; | World *world = scene->world; | ||||
| SceneRenderLayer *srl = v3d->scenelock ? BLI_findlink(&scene->r.layers, scene->r.actlay) : NULL; | |||||
| BLI_listbase_clear(&shadows); | BLI_listbase_clear(&shadows); | ||||
| /* update lamp transform and gather shadow lamps */ | /* update lamp transform and gather shadow lamps */ | ||||
| for (SETLOOPER(scene, sce_iter, base)) { | for (SETLOOPER(scene, sce_iter, base)) { | ||||
| Object *ob = base->object; | Object *ob = base->object; | ||||
| if (ob->type == OB_LAMP) | if (ob->type == OB_LAMP) | ||||
| gpu_render_lamp_update(scene, v3d, ob, NULL, ob->obmat, ob->lay, &shadows, srl); | gpu_render_lamp_update(scene, v3d, ob, NULL, ob->obmat, ob->lay, &shadows); | ||||
| if (ob->transflag & OB_DUPLI) { | if (ob->transflag & OB_DUPLI) { | ||||
| DupliObject *dob; | DupliObject *dob; | ||||
| ListBase *lb = object_duplilist(G.main->eval_ctx, scene, ob); | ListBase *lb = object_duplilist(G.main->eval_ctx, scene, ob); | ||||
| for (dob = lb->first; dob; dob = dob->next) | for (dob = lb->first; dob; dob = dob->next) | ||||
| if (dob->ob->type == OB_LAMP) | if (dob->ob->type == OB_LAMP) | ||||
| gpu_render_lamp_update(scene, v3d, dob->ob, ob, dob->mat, ob->lay, &shadows, srl); | gpu_render_lamp_update(scene, v3d, dob->ob, ob, dob->mat, ob->lay, &shadows); | ||||
| free_object_duplilist(lb); | free_object_duplilist(lb); | ||||
| } | } | ||||
| } | } | ||||
| /* render shadows after updating all lamps, nested object_duplilist | /* render shadows after updating all lamps, nested object_duplilist | ||||
| * don't work correct since it's replacing object matrices */ | * don't work correct since it's replacing object matrices */ | ||||
| for (View3DShadow *shadow = shadows.first; shadow; shadow = shadow->next) { | for (View3DShadow *shadow = shadows.first; shadow; shadow = shadow->next) { | ||||
| ▲ Show 20 Lines • Show All 791 Lines • Show Last 20 Lines | |||||