From 89b9735f99a26b2659957ef42e7aa2b2a8152ef6 Mon Sep 17 00:00:00 2001 From: hyzboy Date: Fri, 15 Mar 2024 01:38:47 +0800 Subject: [PATCH] improved sample. --- CMCore | 2 +- CMSceneGraph | 2 +- example/Gizmo/MetricCellsGrid.cpp | 2 +- .../LightBasic/BlinnPhongDirectionLight.cpp | 85 ++++++++++++------- src/SceneGraph/InlineGeometry.cpp | 6 +- 5 files changed, 62 insertions(+), 35 deletions(-) diff --git a/CMCore b/CMCore index a29a35ec..2f93a1bb 160000 --- a/CMCore +++ b/CMCore @@ -1 +1 @@ -Subproject commit a29a35eceaa9bc19f3e4a64ebebec0a2f6bd081f +Subproject commit 2f93a1bb004cf0e99f51735dc2f65967a3ded1b8 diff --git a/CMSceneGraph b/CMSceneGraph index f610497a..0c9bdb9f 160000 --- a/CMSceneGraph +++ b/CMSceneGraph @@ -1 +1 @@ -Subproject commit f610497a6d403001303e15f474f9fa2a5bc0cc23 +Subproject commit 0c9bdb9fcd9b02a3c5b641285a059362163c94ac diff --git a/example/Gizmo/MetricCellsGrid.cpp b/example/Gizmo/MetricCellsGrid.cpp index 4987a065..6bd15596 100644 --- a/example/Gizmo/MetricCellsGrid.cpp +++ b/example/Gizmo/MetricCellsGrid.cpp @@ -104,7 +104,7 @@ private: { Add(material_instance,scale(PLANE_SIZE,PLANE_SIZE,1)); - camera->pos=Vector3f(PLANE_SIZE/2,PLANE_SIZE/4,PLANE_SIZE/2); + camera->pos=Vector3f(PLANE_SIZE/2,PLANE_SIZE/2,PLANE_SIZE/4); camera_control->SetTarget(Vector3f(0,0,0)); camera_control->Refresh(); diff --git a/example/LightBasic/BlinnPhongDirectionLight.cpp b/example/LightBasic/BlinnPhongDirectionLight.cpp index b55a622d..46c7ce7a 100644 --- a/example/LightBasic/BlinnPhongDirectionLight.cpp +++ b/example/LightBasic/BlinnPhongDirectionLight.cpp @@ -39,10 +39,13 @@ private: private: //sphere - Material * mtl_sun_light =nullptr; - MaterialInstance * mi_sphere =nullptr; - Pipeline * p_sphere =nullptr; + Material * mtl_blinnphong =nullptr; + MaterialInstance * mi_blinnphong =nullptr; + Pipeline * p_blinnphong =nullptr; + Primitive * prim_sphere =nullptr; + Primitive * prim_cone =nullptr; + Primitive * prim_cylinder =nullptr; private: @@ -80,11 +83,11 @@ private: cfg.local_to_world=true; - mtl_sun_light=db->LoadMaterial("Std3D/BlinnPhong/SunLightPureColor",&cfg); - if(!mtl_sun_light)return(false); + mtl_blinnphong=db->LoadMaterial("Std3D/BlinnPhong/SunLightPureColor",&cfg); + if(!mtl_blinnphong)return(false); - mtl_sun_light->BindUBO(DescriptorSetType::Global,"sun",ubo_sun); - mtl_sun_light->Update(); + mtl_blinnphong->BindUBO(DescriptorSetType::Global,"sun",ubo_sun); + mtl_blinnphong->Update(); float mi_data[4]= { @@ -92,31 +95,16 @@ private: 4 //gloss }; - mi_sphere=db->CreateMaterialInstance(mtl_sun_light,nullptr,&mi_data); - if(!mi_sphere)return(false); + mi_blinnphong=db->CreateMaterialInstance(mtl_blinnphong,nullptr,&mi_data); + if(!mi_blinnphong)return(false); - p_sphere=CreatePipeline(mtl_sun_light,InlinePipeline::Solid3D,Prim::Triangles); + p_blinnphong=CreatePipeline(mtl_blinnphong,InlinePipeline::Solid3D,Prim::Triangles); - if(!p_sphere) + if(!p_blinnphong) return(false); return(true); } - - Renderable *Add(Primitive *r,MaterialInstance *mi,Pipeline *p) - { - Renderable *ri=db->CreateRenderable(r,mi,p); - - if(!ri) - { - LOG_ERROR(OS_TEXT("Create Renderable failed.")); - return(nullptr); - } - - render_root.CreateSubNode(ri); - - return ri; - } bool CreateRenderObject() { @@ -136,17 +124,56 @@ private: } //Sphere + prim_sphere=CreateSphere(db,mi_blinnphong->GetVIL(),16); + + //Cone { - prim_sphere=CreateSphere(db,mi_sphere->GetVIL(),32); + struct ConeCreateInfo cci; + + cci.radius =1; //圆锥半径 + cci.halfExtend =1; //圆锤一半高度 + cci.numberSlices=16; //圆锥底部分割数 + cci.numberStacks=8; //圆锥高度分割数 + + prim_cone=CreateCone(db,mi_blinnphong->GetVIL(),&cci); + } + + //Cyliner + { + struct CylinderCreateInfo cci; + + cci.halfExtend =4; //圆柱一半高度 + cci.numberSlices=16; //圆柱底部分割数 + cci.radius =0.25f; //圆柱半径 + + prim_cylinder=CreateCylinder(db,mi_blinnphong->GetVIL(),&cci); } return(true); + } + + Renderable *Add(Primitive *r,MaterialInstance *mi,Pipeline *p,const Matrix4f &mat) + { + Renderable *ri=db->CreateRenderable(r,mi,p); + + if(!ri) + { + LOG_ERROR(OS_TEXT("Create Renderable failed.")); + return(nullptr); + } + + render_root.CreateSubNode(mat,ri); + + return ri; } bool InitScene() { - Add(prim_plane_grid,mi_plane_grid,p_line); - Add(prim_sphere,mi_sphere,p_sphere); + Add(prim_plane_grid,mi_plane_grid,p_line,Identity4f); + + Add(prim_sphere, mi_blinnphong,p_blinnphong,translate(Vector3f(0,0,2))); + Add(prim_cone, mi_blinnphong,p_blinnphong,Identity4f); + Add(prim_cylinder, mi_blinnphong,p_blinnphong,translate(Vector3f(0,0,-5))); camera->pos=Vector3f(32,32,32); camera_control->SetTarget(Vector3f(0,0,0)); diff --git a/src/SceneGraph/InlineGeometry.cpp b/src/SceneGraph/InlineGeometry.cpp index f690eb89..2898c6a7 100644 --- a/src/SceneGraph/InlineGeometry.cpp +++ b/src/SceneGraph/InlineGeometry.cpp @@ -712,7 +712,7 @@ namespace hgl // NOTE: cos (2PIx) = cos (x) and sin (2PIx) = sin (x) so, we can use this formula // normal = {cos(2PIs)cos(2PIt) , sin(2PIs)cos(2PIt) ,sin(2PIt)} *np = +cos2PIs * cos2PIt; ++np; - *np = -sin2PIt; ++np; + *np = +sin2PIt; ++np; *np = +sin2PIs * cos2PIt; ++np; } @@ -943,7 +943,7 @@ namespace hgl if(np) { *np = cos(currentAngle); ++np; - *np = sin(currentAngle); ++np; + *np = -sin(currentAngle); ++np; *np = 0.0f; ++np; } @@ -1112,7 +1112,7 @@ namespace hgl if(np) { *np = h / l * cos(currentAngle); ++np; - *np = h / l * sin(currentAngle); ++np; + *np =-h / l * sin(currentAngle); ++np; *np = r / l; ++np; }